和/或Python中两个对象之间的运算符

Loi*_*Luu 2 python python-2.7

我必须维护一个自2008年以来不再更新的python包.我想当时开发人员使用的Python版本是2.3或2.4,我猜.大多数源代码都是一样的,但我找到了类似的东西:

fsa = (fsa and union(fsa, fsa2)) or fsa2
Run Code Online (Sandbox Code Playgroud)

其中fsa,fsa2,union(fsa, fsa2)都是对象.我不知道他们如何工作来返回新对象.有人可以给我一些提示吗?此外,这些运算符是否仍然允许在Python 2.7中使用?如果不是,我如何更改它以使其在Python 2.7中正常工作?

谢谢,

fil*_*mor 6

请查看文档中的此页面:http://docs.python.org/3.3/faq/programming.html#is-there-an-equivalent-of-cs-ternary-operator

在旧版本的Python中,"和 - 或"习惯用于模拟三元运算符.在现代Python中,您将上面的表达式编写为

fsa = union(fsa, fsa2) if fsa else fsa2
Run Code Online (Sandbox Code Playgroud)

诀窍是短切的行为and,并or在Python:

  • a and b计算结果b是否a为布尔值True,否则计算结果为a
  • a or b计算结果b是否a为布尔值False,否则计算结果为a

把它放在一起,你有一个很好的三元运算符模拟:)

编辑:但是,正如Alfe正确评论的那样,这并不完全等同.如果union(fsa, fsa2)False一个布尔值(即,如果union函数返回None),现有代码将返回,fsa2而"现代"代码将返回None或返回任何错误值union.我坚持使用现有的代码,因为它继续在较新的python版本中工作并记录它.看看执行情况union,决定是否要转换到现代的,恕我直言的清洁器,语法.

  • 这可能是`and` ... `or` 习语的意图,但它与三元并不完全相同。如果 `union(fsa, fsa2)` 返回一个 _falsy_ 值,结果将是 `fsa2`,无论 `fsa` 的值如何。 (2认同)