3
我想在出口()方法中再次調用代碼對象,如果它引發異常(可能是幾次,也許有延遲)。我知道使用裝飾器很容易,但我的動機是有時我想重複一些我不想提取到單獨函數並對其進行裝飾的代碼段。我在找東西沿着這些路線:是否可以在上下文管理器的__exit __()方法內訪問上下文對象(代碼塊)?
class again(object):
def __enter__(self):
pass
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is not None:
???? # Invoke the code object again
return True # eat exception
它會使用像這樣:
x = 0
with again():
print x
x += 1
if x == 1:
raise Exception('I hate 1')
和預期產出將是:
0
1
我能找到一種方法,獲取代碼對象。上下文管理器屬性似乎沒有引用它(我想這不是真的需要,因爲它的工作只是前後做的東西)。
是否可以做到這一點?
'code object'是什麼意思? –
我非常懷疑這是可能的 - 主要是因爲這不是上下文管理者的目的。正如你所暗示的,python的處理方式是通過函數(可能使用裝飾器)。你所描述的氣味更像是紅寶石給我...... – mgilson
上下文管理器用於管理資源。他們從來沒有被設計成「塊裝飾器」來任意改變代碼塊的功能,這正是你所期待的。 – user2357112