Python习惯用于循环中的错误检查

时间:2017-12-18 18:22:28

标签: python python-2.7

我有一个如下所示的循环:

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那样。

2 个答案:

答案 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属性有点太靠近以免感到舒适)