使用装饰器和上下文管理器的函数更改dir的最Pythonic方法是什么?

时间:2013-10-18 09:40:28

标签: python decorator

我编写了一个既作为上下文管理器又作为函数运行的函数。

我的函数可以回到Python 2.6并且可以对抗这个测试:

@cd('/')
def test_cd_decorator():
    assert os.getcwd() == '/'

def test_cd():
    old = os.getcwd()
    with cd('/'):
        assert os.getcwd() == '/'
    assert os.getcwd() == old
    test_cd_decorator()
    assert os.getcwd() == old

test_cd()

什么是最恐怖的解决方案?

1 个答案:

答案 0 :(得分:2)

我不知道有这样的图书馆可以满足您的需求。所以我创建了一个。

import functools
import os

class cd:
    def __init__(self, path):
        self.path = path
    def __enter__(self):
        self.old = os.getcwd()
        os.chdir(self.path)
        return self
    def __exit__(self, exc_type, exc_value, tb):
        os.chdir(self.old)
    def __call__(self, func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            with self:
                return func(*args, **kwargs)
        return wrapper