的Python 3.4提供了這個整齊的工具暫時將stdout:Python中暫時改變一個變量的值
# From https://docs.python.org/3.4/library/contextlib.html#contextlib.redirect_stdout
with redirect_stdout(sys.stderr):
help(pow)
The code不是超級複雜,但我不想把它一遍又一遍寫,尤其是因爲有些人認爲已經進入了它,使其重入:
class redirect_stdout:
def __init__(self, new_target):
self._new_target = new_target
# We use a list of old targets to make this CM re-entrant
self._old_targets = []
def __enter__(self):
self._old_targets.append(sys.stdout)
sys.stdout = self._new_target
return self._new_target
def __exit__(self, exctype, excinst, exctb):
sys.stdout = self._old_targets.pop()
我不知道是否有使用with
語句來臨時更改變量的值的一般方法。來自sys
的兩個其他使用案例是sys.stderr
和sys.excepthook
。
在一個完美的世界裏,像這樣的工作:
foo = 10
with 20 as foo:
print(foo) # 20
print (foo) # 10
我懷疑我們可以作出這樣的工作,但也許這樣的事情是可能的:
foo = 10
with temporary_set('foo', 20):
print(foo) # 20
print (foo) # 10
我可以排序得到的這項工作在globals()
左右,但沒有人會選擇使用。
更新:雖然我認爲我的「foo = 10」示例說明了我正在嘗試執行的操作,但它們並未傳達實際用例。這裏有兩個:
- 重定向標準錯誤,就像redirect_stdout
- 臨時更改sys.excepthook。我以交互方式進行了大量開發,並且當我爲excepthook添加了某些東西時(通過將原始函數包裝在我自己的某個函數中,比如說使用日誌記錄模塊來記錄異常),我通常希望它在某個時候被刪除。這樣我就不會有越來越多的函數包裝自己了。 This question面臨一個密切相關的問題。
你能激勵這樣一個成語嗎?它會在哪種情況下有用? –