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

时间:2014-02-26 08:30:51

标签: python python-2.7

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

fsa = (fsa and union(fsa, fsa2)) or fsa2

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

谢谢,

3 个答案:

答案 0 :(得分:6)

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

在旧版本的Python中,“and-or”习惯用于模拟三元运算符。在现代Python中,您将上面的表达式写为

fsa = union(fsa, fsa2) if fsa else fsa2

诀窍是Python中andor的短切行为:

  • 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的实现,以决定是否要转换到现代的IMHO清理器语法。

答案 1 :(得分:2)

你的一行相当于这两个ifs:

if fsa:
    fsa = union(fsa, fsa2):

if not fsa:
    fsa = fsa2

这种使用布尔运算符的方式(fsa = (fsa and union(fsa, fsa2)) or fsa2)称为短路

python docs中有一些信息和相关问题,例如:Does Python support short-circuiting?

答案 2 :(得分:1)

andor各自返回一个操作数。 and返回第一个 falsy (如果没有则返回最后一个),or返回第一个 truthy (或者最后一个没有是。)

Falsy truthy 指的是对象的布尔值;空字符串,空数组等都是 falsy