[Python-ideas] chdir context manager

Terry Reedy tjreedy at udel.edu
Sat Jan 19 19:07:09 CET 2013


On 1/19/2013 10:06 AM, Daniel Shahaf wrote:
> Terry Reedy wrote on Sat, Jan 19, 2013 at 08:37:17 -0500:
>> On 1/19/2013 5:10 AM, Daniel Shahaf wrote:
>>> The following is a common pattern (used by, for example,
>>> shutil.make_archive):
>>>
>>>       save_cwd = os.getcwd()
>>>       try:
>>>           foo()
>>>       finally:
>>>           os.chdir(save_cwd)
>>>
>>> I suggest this deserves a context manager:
>>>
>>>       with saved_cwd():
>>>           foo()
>>
>> So to me, your proposal is only 1/2 or 2/3 of a context manager. (And
>> 'returns an open file descriptor for the saved directory' seems backward
>> or wrong for a context manager.) It does not actually make a new
>
> What should __enter__ return, then?
>
> It could return None, the to-be-restored directory's file descriptor, or
> the newly-changed-to directory (once a "directory to chdir to" optional
> argument is added).  The latter could be either a pathname (string) or
> a file descriptor (since it's just passed through to os.chdir).
>
> It seems to me returning the old dir's fd would be the most useful of
> the three option, since the other two are things callers already have
> --- None, which is global, and the argument to the context manager.

make_archive would prefer the old dir pathname, as it wants that for the 
logging call. But I do not think that that should drive design.

>> context. A proper temp_cwd context manager should have one parameter,
>> the new working directory, with chdir(new_cwd) in the enter method. To
>> allow for conditional switching, the two chdir system calls could be
>> conditional on new_cwd (either None or '' would mean no chdir calls).
>>
>
> I think making the new_cwd argument optional would be useful if the
> context manager body does multiple chdir() calls:
>
>      with saved_cwd():
>          os.chdir('/foo')
>          do_something()
>          os.chdir('/bar')
>          do_something()
>
> I'm not sure if that's exactly what you suggest --- you seem to be
> suggesting that saved_cwd(None) will avoid calling fchdir() from
> __exit__()?

I was, but that is a non-essential optimization. My idea is basically 
similar to Bueno's except for parameter absent versus None (and the two 
cases could be handled differently).

I think this proposal suffers a bit from being both too specific and too 
general. Eli explained the 'too specific' part: there are many things 
that might be changed and changed back. The 'too general' part is that 
specific applications need different specific details. There are various 
possibilities of what to do in and return from __enter__.

However, given the strong -1 from at least three core developers and 
one other person, the detail seem moot.

--
Terry Jan Reedy

-- 
Terry Jan Reedy




More information about the Python-ideas mailing list