在python中实现pushd
我试图理解下面是如何实现Unix命令pushd的。具体来说,如果yield命令不产生任何结果,那么yield命令的用途是什么在python中实现pushd,python,operating-system,yield,chdir,pushd,Python,Operating System,Yield,Chdir,Pushd,我试图理解下面是如何实现Unix命令pushd的。具体来说,如果yield命令不产生任何结果,那么yield命令的用途是什么 @contextmanager def pushd(path): prev = os.getcwd() os.chdir(path) try: yield finally: os.chdir(prev) 根据wikipedia的说法,“pushd命令将当前工作目录保存在内存中,以便可以随时返回,也可以选择更
@contextmanager
def pushd(path):
prev = os.getcwd()
os.chdir(path)
try:
yield
finally:
os.chdir(prev)
根据wikipedia的说法,“pushd命令将当前工作目录保存在内存中,以便可以随时返回,也可以选择更改为新目录”。此代码块的哪个部分执行此定义中的哪些功能 要理解这段代码,您必须理解为什么使用@contextmanager decorator。它允许您在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'
正如您所看到的-一个目录在带有block的内部已更改为/etc,但在这之后它又返回到/var,类似于popd行为
本例中的yield是上下文管理器decoratorapi的一部分,在本例中它不需要返回任何内容。它用于类似的结构
with open('my_file.txt') as file:
do_something_with_file(file)
您实际上需要一些资源来处理内部上下文
有关本模块目标的更多信息,请参阅文档