在python中推送的实现

问题描述 投票:0回答:1

我试图了解以下内容是如何推动Unix命令的实现。具体来说,如果yield命令不产生任何结果,它的目的是什么。

@contextmanager
def pushd(path):
    prev = os.getcwd()
    os.chdir(path)
    try:
        yield
    finally:
        os.chdir(prev)

根据Wikipedia,'pushd命令将当前的工作目录保存在内存中,以便可以随时将其返回,也可以选择更改为新目录'。此代码块的哪一部分执行此定义中的哪些功能?

python operating-system yield chdir pushd
1个回答
0
投票

要理解此代码,您必须了解为什么使用@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文档以了解有关模块目标的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.