Python中两个对象之间的And/Or运算符

2024-05-09 00:55:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

其中fsafsa2union(fsa, fsa2)都是对象。我不知道他们是如何返回新对象的。有人能给我一些提示吗?另外,Python2.7中还允许使用这些运算符吗?如果没有,如何更改它以使其在Python2.7中正常工作?在

谢谢


Tags: orand对象版本源代码开发人员运算符fsa
3条回答

你的一行相当于这两个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?

and和{}各自返回一个操作数。and返回第一个falsy(如果没有,则返回最后一个),or返回第一个truthy(如果没有,则返回最后一个)。在

Falsytruthy指对象的布尔值;空字符串、空数组等都是Falsy。在

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

在早期版本的Python中,“and或”习惯用法用于模拟三元运算符。在现代Python中,可以将上面的表达式写成

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

诀窍在于Python中and和{}的快捷行为:

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

把这些放在一起,你就有了一个不错的三元运算符模拟:)

编辑:然而,正如阿尔夫正确地评论的那样,这并不完全等同。如果union(fsa, fsa2)是{}的布尔值(即union函数返回None),则现有代码将返回fsa2,而“现代”代码将返回None或返回的任何假值union。我会坚持使用现有的代码,因为它可以在更新的python版本中继续工作并对其进行文档化。看看union的实现,以决定是否要转换到现代的、更干净的语法。在

相关问题 更多 >

    热门问题