كيف يمكنني العودة للاهتمام القيم من مع البيان ؟
-
22-08-2019 - |
سؤال
هل هناك طريقة أفضل من استخدام 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