진술과 함께 흥미로운 값을 어떻게 반환해야합니까?
-
22-08-2019 - |
문제
컨텍스트 관리자로부터 흥미로운 가치를 얻기 위해 글로벌을 사용하는 것보다 더 좋은 방법이 있습니까?
@contextmanager
def transaction():
global successCount
global errorCount
try:
yield
except:
storage.store.rollback()
errorCount += 1
else:
storage.store.commit()
successCount += 1
기타 가능성 :
싱글 톤
일종의 글로벌 ...
맥락 관리자에 대한 논쟁으로서 튜플
기능을 문제에보다 구체적으로 만들고 재사용 가능성이 떨어집니다.
특정 속성을 컨텍스트 관리자의 인수로 보유하는 인스턴스
튜플과 같은 문제이지만 더 읽기 쉬운 문제
컨텍스트 관리자의 끝에서 값을 보유한 예외를 제기하십시오.
정말 나쁜 생각
해결책
보다 http://docs.python.org/reference/datamodel.html#context-managers
성공과 오류 계수를 보유하고있는 클래스를 만듭니다. __enter__
그리고 __exit__
행동 양식.
다른 팁
나는 당신이 당신에게 말했듯이 당신이 당신에게 오류/성공 수를 유지하기 위해 수업을 만들어야한다고 생각합니다. 마지막 질문. 나는 당신이 당신의 자신의 수업을 가지고 있다고 생각합니다. 그래서 이와 같은 것을 추가하십시오.
class transaction:
def __init__(self):
self.errorCount = 0
self.successCount = 0
def __enter__(*args):
pass
def __exit__(self, type, value, traceback):
if type:
storage.store.rollback()
self.errorCount += 1
else:
storage.store.commit()
self.successCount += 1
(type
한 번 예외가 없으면 contextmanager
)
그리고 아마 당신은 아마도 이미 어딘가에서 사용하고있을 것입니다. contextmanager
그리고 당신의 __exit__()
암호. 편집하다: Eli가 언급했듯이 Coutners를 재설정하려면 새 트랜잭션 인스턴스 만 작성하십시오.
t = transaction()
for q in queries:
with t:
t.execute(q)
"맥락 관리자에 대한 논쟁으로서의 튜플
기능을 문제에보다 구체적으로 만들고 재사용 가능성이 적습니다. "
거짓.
이것은 컨텍스트 관리자가 상태를 유지하게합니다.
이보다 더 많은 것을 구현하지 않으면 재사용 할 수 있습니다.
그러나 튜플은 불변이기 때문에 실제로 튜플을 사용할 수 없습니다. 변한 컬렉션이 필요합니다. 사전과 수업 정의가 떠 오릅니다.
결과적으로 권장 구현은 다음과 같습니다
"특정 속성을 컨텍스트 관리자에 대한 인수로 보유하는 인스턴스"
두 가지 속성을 가진 간단한 클래스 정의 만 있으면됩니다. 그러나 거래 상태는 상태가 높고 어딘가에 상태를 유지해야합니다.
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