首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“旗帜”概念的毕德之道

“旗帜”概念的毕德之道
EN

Stack Overflow用户
提问于 2019-06-22 22:45:17
回答 3查看 103关注 0票数 1

考虑以下情况:

代码语言:javascript
复制
flag = 'a'
while True:
    try:
        # something that might fail
    except:
        # fix failure
        flag = 'b'
    else:
        break

print(flag)

我觉得在这种情况下,一定有更好的方法来找出发生了什么,而不是使用标志,但想不出有什么比这更"pythonic“的了。

EN

回答 3

Stack Overflow用户

发布于 2019-06-22 23:02:34

您可以将对异常/默认情况的处理放到exceptelse块中。然而,这是不同的代码,因为现在您将在每个异常上打印,而不是在退出while循环后只打印一次,所以这对于循环外的try/except/else更有意义。如果您在循环中,但仍然只想在循环完成时打印一次(即,一旦没有引发异常),我认为您的方法已经足够清楚了。

代码语言:javascript
复制
while True:
    try:
        # something that might fail
    except:
        # fix failure
        print("b")
    else:
        print("a")
        break
票数 2
EN

Stack Overflow用户

发布于 2019-06-22 23:06:10

我认为这更像是一个一般性的编程问题。使用好的名字来表达你的意思。“旗帜”是什么意思?将其重命名为"done“并重新阅读代码,您将看到一堆不必要的东西用于一个简单的while循环。

代码语言:javascript
复制
numerator = 1
denominator = 0

done = False
while not done:
    try:
        x = numerator // denominator
        done = True
    except:
        denominator = 1

但是,为了更好地说明发生了什么以及发生的原因,我们想要添加日志记录(也是通用编程,而不是专门的pythonic编程)。例如,这将允许您在许多不同的异常处理程序中跟踪许多不同的代码路径。

代码语言:javascript
复制
import logging

# one time setup, can be in a different file
log = logging.getLogger('myapp')
log.setLevel(logging.ERROR)
fh = logging.FileHandler('myapp.log')
log.addHandler(fh)

log.info('about to begin')
done = False
while not done:
    try:
        x = n // d
        done = True
    except NameError as e:
        log.error('oops forgot to initialize: ' + str(e))
        n = 1
        d = 0
    except ZeroDivisionError as e:
        log.error('division by zero')
        d = 1
    except Exception as e:
        log.error('unknown error: ' + str(e))

log.info('done')

错误将存储在您指定的日志文件中。您可以很大程度上控制它是否记录日志,以及将日志放在哪里。例如,我有针对begin和end的log.info消息,但您并不总是想要所有内容。它们不会记录,因为我将日志级别设置为ERROR,所以这个日志文件'myapp.log‘将只有log.error消息。

如果您真的想知道日志,那么可以将日志看作一条print语句,它只会到达您想要的位置,这样您就可以有效地将它留在其中。在调试程序时,logging.DEBUG消息特别适合于了解程序中何时发生事件,但稍后会通过设置不同的日志记录级别来禁用它。

票数 2
EN

Stack Overflow用户

发布于 2019-06-22 23:44:38

还有一个我喜欢的模式:

  1. 将不安全的函数包装在一个安全的函数中,该函数在失败时将返回False或None

your initial

  1. Do a False

示例:

代码语言:javascript
复制
# It only works for positive numbers
In [24]: def run_safe(x):
    ...:     if x < 0:
    ...:         x = 0
    ...:     try:
    ...:         return 100 / x
    ...:     except Exception:
    ...:         return None


In [25]: i = -4

In [26]: while run_safe(i) is None:
    ...:     print("i={} failed".format(i))
    ...:     i += 1
    ...:
    ...:
i=-4 failed
i=-3 failed
i=-2 failed
i=-1 failed
i=0 failed

# At the end i has the value that succeeds
In [27]: print(i)
1

对我来说,这个方法将有风险的代码(现在位于函数中)与位于while循环中的"fix“分开。我发现当其中任何一个代码(风险或修复)都很复杂时,这会更容易阅读。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56716412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档