我试图了解以下内容是如何推动Unix命令的实现。具体来说,如果yield命令不产生任何结果,它的目的是什么。
@contextmanager
def pushd(path):
prev = os.getcwd()
os.chdir(path)
try:
yield
finally:
os.chdir(prev)
根据Wikipedia,'pushd命令将当前的工作目录保存在内存中,以便可以随时将其返回,也可以选择更改为新目录'。此代码块的哪一部分执行此定义中的哪些功能?
要理解此代码,您必须了解为什么使用@contextmanager装饰器。它允许您在with
语句中使用某些函数,该函数将为您处理context。因此,您想在某个目录中执行某些操作然后跳回-您的操作将在您进入的目录的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文档以了解有关模块目标的更多信息。