On 15.09.2021 21:02, Guido van Rossum wrote:
> To make chdir() return a context manager *and* keep it working without calling
> `__enter__`, it would have to call `getcwd()`, which I've heard is expensive.
> 
> So I don't think that would work, alas.

At least on Linux, the cost for os.getcwd() is similar to the cost
of os.chdir(), but yes, since we can't have os.chdir() not change
the dir when called, the logic would need the extra os.getcwd() call:

# python3 -m timeit -s 'import os' "os.getcwd()"
500000 loops, best of 5: 619 nsec per loop
# python3 -m timeit -s 'import os' "os.chdir('.')"
500000 loops, best of 5: 726 nsec per loop

Here's simple implementation of the chdir() context manager:

import os
import pathlib

# chdir context manager
PlatformPath = pathlib.WindowsPath if os.name == 'nt' else pathlib.PosixPath
class chdir(PlatformPath):
    def __init__(self, dir):
        self.dir = dir
        self.olddir = os.getcwd()
        os.chdir(dir)
    def __enter__(self):
        return self
    def __exit__(self, *exc):
        os.chdir(self.olddir)
        return False

# Normal chdir()
path = chdir('abc/')
print (os.getcwd())
print (path.olddir)

# chdir() context manager
with chdir('def/') as wd:
    print (repr(wd))
    print (os.getcwd())
    print (os.listdir('.'))

For extra perks, I made os.chdir() return a pathlib Path object
and you get to see the old directory, so you can backtrack
if needed, even without a context manager.


> On Wed, Sep 15, 2021 at 11:55 AM Eric V. Smith <e...@trueblade.com
> <mailto:e...@trueblade.com>> wrote:
> 
>     On 9/15/2021 2:48 PM, Eric Fahlgren wrote:
>>     On Wed, Sep 15, 2021 at 12:21 AM Eric V. Smith <e...@trueblade.com
>>     <mailto:e...@trueblade.com>> wrote:
>>
>>         And I'm not crazy about the name "workdir". To me, it sounds like it
>>         returns something, not sets and resets something. But I don't have a
>>         particularly great alternative in mind: in my own code I've used
>>         "change_dir", which isn't awesome either.
>>
>>
>>     Our version is named "pushdir", modeled after shell's pushd (even though
>>     pushdir is a context manager and does auto-pop).  Everyone figures out
>>     what it does at a glance.
> 
>     That's a great name!
> 
>     Although I think having os.chdir() return a context manager is a better
>     design (assuming it can work, but at first blush it would seem so).
> 
>     Eric
-- 
Marc-Andre Lemburg
eGenix.com

Professional Python Services directly from the Experts (#1, Sep 15 2021)
>>> Python Projects, Coaching and Support ...    https://www.egenix.com/
>>> Python Product Development ...        https://consulting.egenix.com/
________________________________________________________________________

::: We implement business ideas - efficiently in both time and costs :::

   eGenix.com Software, Skills and Services GmbH  Pastor-Loeh-Str.48
    D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
           Registered at Amtsgericht Duesseldorf: HRB 46611
               https://www.egenix.com/company/contact/
                     https://www.malemburg.com/

_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/KRMBQYQUCSU4GYN3F4OPUKVQ72VLCBIV/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to