我试图了解以下内容是如何推送Unix命令的实现。具体来说,如果yield命令不产生任何结果,它的目的是什么。
@contextmanager
def pushd(path):
prev = os.getcwd()
os.chdir(path)
try:
yield
finally:
os.chdir(prev)
根据Wikipedia,“ pushd命令将当前工作目录保存在内存中,以便可以随时将其返回,也可以选择更改为新目录”。此代码块的哪一部分执行此定义中的哪些功能?
答案 0 :(得分:1)
要理解此代码,您必须了解为什么使用@contextmanager装饰器。它允许您在with
语句中使用某些函数,该函数将为您处理 context 。因此,您想在某个目录中执行某些操作然后跳回-在您进入的目录的上下文中,您的操作才有意义。因此,此功能的用例如下:
In [4]: os.chdir('/var')
In [5]: os.getcwd()
Out[5]: '/var'
In [6]: with pushd('/etc'):
...: print(os.getcwd())
...:
/etc
In [7]: os.getcwd()
Out[7]: '/var'
您可以看到-with
块中的目录已更改为/ etc,但之后又返回到/ var,类似于popd的行为。
yield是上下文管理器装饰器API的一部分,在这种情况下,它不需要返回任何内容。像
with open('my_file.txt') as file:
do_something_with_file(file)
您实际上需要一些资源来处理内部上下文。
请参阅contextlib文档,以了解有关模块目标的更多信息。