كيف يمكنني العودة للاهتمام القيم من مع البيان ؟

StackOverflow https://stackoverflow.com/questions/877709

سؤال

هل هناك طريقة أفضل من استخدام globals للحصول على قيم مثيرة للاهتمام من سياق مدير ؟

@contextmanager
def transaction():
    global successCount
    global errorCount
    try:
        yield
    except:
        storage.store.rollback()
        errorCount += 1
    else:
        storage.store.commit()
        successCount += 1

الاحتمالات الأخرى:

  • ووحدانية

    نوع من globals...

  • tuple كحجة سياق مدير

    يجعل العمل أكثر خاصة مشكلة /أقل قابلة لإعادة الاستخدام

  • سبيل المثال أن يحمل سمات محددة كحجة سياق مدير

    نفس المشاكل tuple ، ولكن أكثر مقروءة

  • رفع استثناء في نهاية السياق عقد مدير القيم.

    حقا فكرة سيئة

هل كانت مفيدة؟

المحلول

انظر 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__() التعليمات البرمجية. تحرير: كما ايلي علق فقط إنشاء معاملة جديدة سبيل المثال عندما كنت ترغب في إعادة تعيين coutners.

t = transaction()
for q in queries:
    with t:
        t.execute(q)

"tuple كحجة سياق مدير

يجعل العمل أكثر خاصة مشكلة /أقل القابل لإعادة الاستخدام"

كاذبة.

وهذا يجعل سياق مدير تحتفظ الدولة.

إذا لم تنفذ أي شيء أكثر من هذا ، وسوف تكون قابلة لإعادة الاستخدام.

ومع ذلك ، لا يمكنك فعلا استخدام tuple لأنه غير قابل للتغيير.تحتاج بعض مجموعة قابلة للتغيير.القواميس تعريفات فئة تتبادر إلى الذهن.

وبالتالي فإن التنفيذ الموصى به هو

"المثال الذي يحمل سمات محددة كحجة سياق مدير"

فئة بسيطة الوضوح مع اثنين من سمات هو كل ما تحتاج.ومع ذلك ، معاملتك حالة جليل و عليك أن تحتفظ الدولة في مكان ما.

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