[Python-ideas] Add a context manager to keep stream position unchanged

Joao S. O. Bueno jsbueno at python.org.br
Mon Mar 30 14:52:28 CEST 2015


On 29 March 2015 at 19:01, Tim Delaney <timothy.c.delaney at gmail.com> wrote:
> On 30 March 2015 at 04:04, Dmitry Kazakov <jsbfox at gmail.com> wrote:
>>
>> I propose adding a context manager to contextlib module, which would
>> restore the stream position of its argument at exit:
>>
>>     with contextlib.closing(file_like_object) as file:
>>         file.read(1)
>>         old = file.tell()
>>         with contextlib.keep_stream_position(file) as f:
>>             assert file is f
>>             assert file_like_object is f
>>             # Do something with the file(-like) object e.g. feed it
>>             # to `PIL.Image.open` (will consume the whole stream)
>>
>>         assert file.tell() == old
>>
>> This CM would allow us to reuse streams efficiently, without requiring
>> to call seek() explicitly. I will open a new issue and submit a patch
>> in case of favorable responses.
>
>
> I like the idea. Might need some bikeshedding on the name (maybe
> restore_position?).
>
> To test for seeking, I would suggest having a seek to current position
> during construction. Not perfect (e.g. there may be streams that can only
> seek forwards, not backwards) but I think it's the best non-destructive
> option.
>

If that is being done, anyway, I propose an optional parameter that
would allow the context to internally use itertools.tee if the stream
can't seek itself.

Maybe with even three states:
"strict":  raises an exception if the stream is not [back]seekable
"default": creates a tee cache if the stream is not back-seekable
"cache": always cache.

(And maybe a maxbuffer parameter to go along? )



> Tim Delaney
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/


More information about the Python-ideas mailing list