[Python-Dev] io.BufferedReader.peek() Behaviour in python3.1

Nick Coghlan ncoghlan at gmail.com
Sat Jun 13 08:59:02 CEST 2009


Cameron Simpson wrote:
> On 13Jun2009 12:24, Nick Coghlan <ncoghlan at gmail.com> wrote:
> | I would phrase this suggestion as users having a reasonable expectation
> | that the following invariant should hold for a buffered stream:
> | 
> |   f.peek(n) == f.read(n)
> | 
> | Since the latter method will perform as many reads of the underlying
> | stream as necessary to reach the requested number of bytes (or EOF),
> | then so should the former.
> 
> I disagree. If that were that case, why have peek() at all? I realise
> that it doesn't move the logical position, but it does mean that
> peek(huge_number) imposes a requirement to grow the stream buffer
> arbitrarily.
> 
> A peek that does at most one raw read has the advantage that it can pick up
> data outside the buffer but lurking in the OS buffer, yet to be obtained.
> Those data are free, if they're present. (Of course, if they're absent
> peek() wil still block).

Note my suggestion later that if the above invariant were to be adopted
then a peek1() method should be added to parallel read1().

However, from what Benjamin has said, a more likely invariant is going
to be:

  preview = f.peek(n)
  f.read(n).startswith(preview)

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
---------------------------------------------------------------


More information about the Python-Dev mailing list