这是我的第一个代码:
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
”一样快吗?
答案 0 :(得分:4)
表达式
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:
LogicalORExpression
:LogicalORExpression || LogicalANDExpression
- 让
的结果lref
成为评估LogicalORExpression
。- 让
lval
成为GetValue(lref)
。- 让
lbool
成为ToBoolean(lval)
。ReturnIfAbrupt(lbool)
。- 如果
lbool
为真,请返回lval
。- 让
的结果rref
成为评估LogicalANDExpression
。- 返回
醇>GetValue(rref)
。
但是,您应该在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:因为or
和and
会返回操作数:即最后一个。
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