“或{}”是否像在javascript中一样在python中工作?

时间:2015-12-18 12:58:02

标签: python

这是我的第一个代码:

def __init__(self, attrs=None):
    if not attrs:
        attrs = {}
    attrs['data-select2-json'] = "true"

然后我尝试用JavaScript:

def __init__(self, attrs=None):
    attrs = attrs or {}
    attrs['data-select2-json'] = "true"

它似乎工作,但我想知道:“或{}”在javascript中的python中工作吗? (很难用谷歌搜索这个!)并且它和我的第一个代码的简单“if”一样快吗?

3 个答案:

答案 0 :(得分:4)

根据documentation

  

表达式x or y首先评估x;如果x为真,则其值为   回;否则,将评估y,结果值为   返回。

这意味着,您的两个代码都做同样的事情:

if not attrs:
    attrs = {}

评估attrs。如果attrs为真,则不执行任何操作,否则会将{}分配给attrs

attrs = attrs or {}

评估attrs。当attrs为真时 - 将attrs分配给attrs(不确定优化),否则将{}分配给attrs

在JavaScript运算符x || y中,x评估为true时返回x,否则返回y。引自standard

  

LogicalORExpressionLogicalORExpression || LogicalANDExpression

     
      
  1. lref成为评估LogicalORExpression
  2. 的结果   
  3. lval成为GetValue(lref)
  4.   
  5. lbool成为ToBoolean(lval)
  6.   
  7. ReturnIfAbrupt(lbool)
  8.   
  9. 如果lbool为真,请返回lval
  10.   
  11. rref成为评估LogicalANDExpression
  12. 的结果   
  13. 返回GetValue(rref)
  14.   

但是,您应该在JavaScript中注意conversions to boolean

> Boolean({})
true
> Boolean([])
true

答案 1 :(得分:0)

你的第一个版本对我来说更具可读性,但是如果你坚持使用一个衬垫,你可以使用它(来自Python 2.5):

    attrs = {} if attrs is None else attrs

答案 2 :(得分:-1)

是的,JS风格的赋值是有效的Python。它源于Python中的真实性概念。

如果您尝试a = 0 or 5,则会发现a == 5,因为0是假的,但5是Truthy。 docs概述了什么是Falsy。

您可能很好奇为什么{}在您的代码中评估Truthy值时,文档提到它是Falsy:因为orand会返回操作数:即最后一个。

由于此异常,

a = 0 or None or {} or []会将[]绑定到a

在您的示例中,None是Falsy,但{}是绑定的,因为它是最后一个。

简而言之,在使用or进行分配时,它将分配给第一个Truthy值(或者在一个Falsy值字符串中的最后一个Falsy值)。

>>> class Foo:
...   def __init__(self, attrs=None):
...     if not attrs:
...         attrs = {}
...     print(attrs)
... 
>>> Foo(attrs={'1': '2'})
{'1': '2'}
<__main__.Foo instance at 0x1006e5b90>
>>> Foo()
{}
<__main__.Foo instance at 0x1006e59e0>
>>> class Foo:
...   def __init__(self, attrs=None):
...     attrs = attrs or {}
...     print(attrs)
... 
>>> Foo(attrs={'1': '2'})
{'1': '2'}
<__main__.Foo instance at 0x1006e5bd8>
>>> Foo()
{}
<__main__.Foo instance at 0x1006e59e0>

只是一个警告,这不是令人难以置信的Pythonic。通常你会看到

a = <default> if cond else a