這是一個非常好的用例,用於context manager。
class ArgvContext(object):
def __enter__(self):
self.tmp_argv = sys.argv
sys.argv = []
def __exit__(self, exc_type, exc_val, exc_tb):
sys.argv = sys.tmp_argv
用法:
with ArgvContext():
from ROOT import *
在__enter__
的代碼之前執行,並且上下文之後在__exit__
的代碼。這裏的上下文只是意味着在with
聲明下縮進的所有內容。使用屬性self
來傳遞前後的信息。
一個簡單的例子:
class Context(object):
def __enter__(self):
print('start')
def __exit__(self, exc_type, exc_val, exc_tb):
print('end')
with Context():
print('doing')
打印:
start
doing
end
在__exit__
的代碼也是在一個異常的情況下執行:
with Context():
1/0
輸出:
start
end
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
...
ZeroDivisionError: division by zero
這聽起來像一個計劃很糟糕的模塊......它是公開的嗎?如果是這樣,哪一個呢? – skrrgwasme
什麼阻止你只是把這些代碼行功能?你有沒有嘗試過,並得到一個錯誤或意外的行爲? – skrrgwasme
使用'global'關鍵字 – tdelaney