我想嘗試使用python with
塊來將修飾符應用於該塊內的操作。但我不確定在協同程序的存在下是否可以做到這一點。Python`with`上下文vs生成器/協同程序/任務
例如,假設我有一個WithContext
對象暫時推到堆棧上是這樣的:
class WithContext:
stack = []
def __init__(self, val):
self.val = val
def __enter__(self):
WithContext.stack.append(self.val)
def __exit__(self, exc_type, exc_val, exc_tb):
WithContext.stack.pop()
def do_scoped_contextual_thing():
print(WithContext.stack[-1])
(顯然堆疊構件將必須是線程局部,但忽略現在)
那麼這個代碼:
with WithContext("a"):
do_scoped_contextual_thing()
with WithContext("b"):
do_scoped_contextual_thing()
with WithContext("c"):
do_scoped_contextual_thing()
會打印:
a
b
c
但現在假設我有一個協同程序情況:
def coroutine():
with WithContext("inside"):
yield 1
do_scoped_contextual_thing()
yield 2
with WithContext("outside"):
for e in coroutine():
do_scoped_contextual_thing()
print("got " + str(e))
我想這段代碼的輸出:
outside
got 1
inside
outside
got 2
但實際上它會輸出:
inside
got 1
inside
inside
got 2
的外面因爲__enter__
裏面的內容而改成內側他的協同程序在棧頂放置了一個值,並且在協程結束之前不調用__exit__
(而不是在你跳入和退出協程時不斷地進入和退出)。
有沒有辦法解決這個問題?是否存在「協同本地」變量?
沒有全局可變狀態('WithContext.stack' here);代之以傳入。在協程(堆棧)中用於e:do_scoped_contextual_thing(stack)'其中'stack'是不可變的。 – Ryan
您是否考慮過上下文結果的訪問者?像WithContext('outside')這樣的外部:'...'outside.do_scoped_contextual_thing()'? –
@Ryan是的,我知道它的缺點。我仍然想試驗它。 –