我必须维护一个自2008年以来不再更新的python包。我想当时开发人员使用的Python版本是2.3或2.4,我猜。大多数源代码都是一样的,但我找到了类似的东西:
fsa = (fsa and union(fsa, fsa2)) or fsa2
其中fsa
,fsa2
,union(fsa, fsa2)
都是对象。我不知道他们如何工作来返回新对象。有人可以给我一些提示吗?此外,这些运算符是否仍然允许在Python 2.7中使用?如果不是,我如何更改它以使其在Python 2.7中正常工作?
谢谢,
答案 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中and
和or
的短切行为:
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)
and
和or
各自返回一个操作数。 and
返回第一个 falsy (如果没有则返回最后一个),or
返回第一个 truthy (或者最后一个没有是。)
Falsy 和 truthy 指的是对象的布尔值;空字符串,空数组等都是 falsy 。