我正在尝试理解以下内容是如何实现Unix命令pushd的。具体地说,在不产生任何结果的情况下,yield命令的用途是什么。
@contextmanager
def pushd(path):
prev = os.getcwd()
os.chdir(path)
try:
yield
finally:
os.chdir(prev)根据维基百科的说法,“pushd命令将当前工作目录保存在内存中,这样它就可以随时返回,也可以选择切换到新目录。”此代码块的哪一部分执行此定义中的哪些函数?
发布于 2020-03-18 19:34:43
要理解这段代码,你必须理解为什么要使用@contextmanager装饰器。它允许您在with语句中使用一些函数,这些函数将为您处理上下文。因此,您希望在某个目录中执行某些操作,然后跳回-您的操作在您跳过的目录的上下文中是有意义的。因此,此函数的用例如下所示:
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的行为。
在这种情况下,need是上下文管理器装饰器API的一部分,在这种情况下它不需要返回任何内容。它用的是像这样的结构
with open('my_file.txt') as file:
do_something_with_file(file)你实际上需要一些资源来处理内部上下文。
有关本模块目标的更多信息,请参阅contextlib文档。
https://stackoverflow.com/questions/57010718
复制相似问题