我一直在重构一些相当笨拙的代码,并遇到了以下相当奇怪的结构:
#!/usr/bin/env python2.7
# ...
if (opts.foo or opts.bar or opts.baz) is None:
# (actual option names changed to protect the guilty)
sys.stderr.write("Some error messages that these are required arguments")
...我想知道这是否有任何可能的意义。
我将其更改为:
#!/usr/bin/env python2.7
if None in (opts.foo, opts.bar, opts.baz):
# ...
我确实启动了一个解释器并实际尝试了第一个构造......它似乎只在值全部为假并且这些假值中的最后一个为无时才有效。(换句话说,CPython 的实现似乎从or表达式链中返回第一个真值或最后一个假值)。
我仍然怀疑正确的代码应该使用在 2.5 中添加的any()或all()内置插件(有问题的代码已经需要 2.7)。我还不确定哪个是首选/预期的语义,因为我刚刚开始这个项目。
那么在任何情况下这个原始代码是有意义的吗?