您不能僅僅使用任何類/函數作爲上下文管理器,它必須實際上明確地以這種方式實現,使用函數上的contextlib.contextmanager
修飾器,或者在類的情況下,通過定義__enter__
and __exit__
實例方法。
您正在使用的sh.cd
函數就是圍繞os.chdir
的包裝:
>>> import sh
>>> sh.cd
<bound method Environment.b_cd of {}>
b_cd
定義爲:
def b_cd(self, path):
os.chdir(path)
正如你所看到的,它只是一個正常的功能;它不能用作上下文管理器。
提供的鏈接whereswalden展示了一種實現想要作爲類的行爲的好方法。它可以類似地實現這樣的功能:
import contextlib
import os
@contextlib.contextmanager
def cd(path):
old_path = os.getcwd()
os.chdir(path)
try:
yield
finally:
os.chdir(old_path)
使用範例:
print(os.getcwd())
with cd("/"):
print os.getcwd()
print(os.getcwd())
輸出:
'/home/dan'
'/'
'/home/dan'
有一個在[這個答案](HTTP一個很好的解決方案:// stackoverflow.com/a/13197763/1901786)。 – whereswalden
thx,@whereswalden。我之前做過一些研究,也偶然發現了這個問題。但我想知道是否沒有「短」解決方案。這似乎是一個經常使用的情況。 –