我编写了一个既作为上下文管理器又作为函数运行的函数。
我的函数可以回到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()
什么是最恐怖的解决方案?
答案 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