我有一个如下所示的循环:
errors += 1
for ...:
...
if ...:
logger.error(...)
errors += 1
continue
...
if ...:
logger.error(...)
errors += 1
continue
...
if ...:
logger.error(...)
errors += 1
continue
...
logger.info("%d errors",errors)
我想知道使其更具可读性的pythonic方法是什么。
我能做到
def e (fmt, *args):
logger.error(fmt, *args)
errors += 1
for ...:
...
if ...:
e(...)
continue
...
if ...:
e(...)
continue
...
if ...:
e(...)
continue
...
logger.info("%d errors",errors)
甚至
def e (cond, fmt, *args):
if cond:
logger.error(fmt, *args)
errors += 1
return cond
for ...:
...
if e(...):
continue
...
if e(...):
continue
...
if e(...)
continue
...
logger.info("%d errors",errors)
然而,看起来我不能做得更好(没办法continue
来自e
}内部。
右?
(我想我可以在StopIteration
中提出e
来中止迭代,但不会像不存在的ContinueIteration
那样。
答案 0 :(得分:4)
感觉像使用异常处理一样在语义上是合适的,同样简洁的功能而不需要任何continue
:
for ...:
try:
# ...
if ...:
raise SomeException(...)
# ...
if ...:
raise SomeException(...)
# ...
if ...:
raise SomeException(...)
# ...
except SomeException as e:
logger.error(e.message)
errors += 1
答案 1 :(得分:0)
您可以为logger
创建一个包装,记录error
被调用的次数:
class CountingLogger:
def __init__(self, real_logger, initial_errors=0):
self.logger = real_logger
self.errors = initial_errors
def error(self, *args, **kw):
self.logger.error(*args, **kw)
self.errors += 1
然后您使用e = CountingLogger(logger)
之类的内容并在循环中调用e.error()
,然后您可以访问e.errors
以查看其被调用的次数。 (命名可能会更好,error
方法和errors
属性有点太靠近以免感到舒适)