Geo*_*lly 4 python with-statement contextmanager
有没有比使用全局变量从上下文管理器获取有趣值更好的方法?
@contextmanager
def transaction():
global successCount
global errorCount
try:
yield
except:
storage.store.rollback()
errorCount += 1
else:
storage.store.commit()
successCount += 1
Run Code Online (Sandbox Code Playgroud)
其他可能性:
有点全局...
使功能更加特定于问题/更少可重用
与元组相同的问题,但更清晰
真的很糟糕
请参阅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
Run Code Online (Sandbox Code Playgroud)
(type如果调用后没有异常,则为 None contextmanager)
然后您可能已经在某处使用它,它将调用contextmanager并运行您的__exit__()代码。 编辑:正如 Eli 所评论的,只有在您想要重置计数器时才创建一个新的事务实例。
t = transaction()
for q in queries:
with t:
t.execute(q)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3611 次 |
| 最近记录: |