문제

컨텍스트 관리자로부터 흥미로운 가치를 얻기 위해 글로벌을 사용하는 것보다 더 좋은 방법이 있습니까?

@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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top