"кортеж в качестве аргумента для диспетчера контекста
делает функцию более специфичной для проблемы / менее пригодной для повторного использования "
Ложные.
Это заставляет менеджер контекста сохранять состояние.
Если вы не реализуете ничего, кроме этого, оно будет использоваться повторно.
Однако вы не можете использовать кортеж, потому что он неизменный. Вам нужна изменчивая коллекция. В голову приходят словари и определения классов.
Следовательно, рекомендуемая реализация
"экземпляр, который содержит определенные атрибуты в качестве аргумента диспетчера контекста"
Простое определение класса с двумя атрибутами - это все, что вам нужно. Тем не менее, ваш статус транзакции является состоянием, и вам нужно где-то сохранить состояние.
class Counters(dict):
SUCCEED= 0
FAIL= 1
def __init__( self ):
self[ self.SUCCEED ]= 0
self[ self.FAIL ]= 0
def increment( self, status ):
self[status] += 1
class Transaction(object):
def __init__( self, worker, counters ):
self.worker= worker
self.counters= counters
def __enter__( self ):
self.counters.status= None
def process( self, *args, **kw ):
status= self.worker.execute( *args, **kw )
self.counters.increment( status )
def __exit__( self ):
pass
counts= Counters()
for q in queryList:
with Transaction(execQuery,counts) as t:
t.process( q )
print counts