如果没有,什么是最好的方法?
现在我正在做(对于Django项目):
if not 'thing_for_purpose' in request.session:
request.session['thing_for_purpose'] = 5
但它很尴尬。在Ruby中,它将是:
request.session['thing_for_purpose'] ||= 5
更好。
如果没有,什么是最好的方法?
现在我正在做(对于Django项目):
if not 'thing_for_purpose' in request.session:
request.session['thing_for_purpose'] = 5
但它很尴尬。在Ruby中,它将是:
request.session['thing_for_purpose'] ||= 5
更好。
nil
(在布尔上下文中为false),因此该习语通常完全用于肖恩使用它的目的。成语只能尽管如果,当然,nil
和false
在散列不合法的值(这是非常往往是真的,那么这个成语是罚款)
Answers:
可接受的答案对字典很有用,但是标题寻求的通用含义与Ruby的|| =运算符相同。在Python中执行|| =之类的常见方法是
x = x or new_value
x
在预先定义的情况下才有效(例如,None
在类初始化方法中设置为)。
精确答案:否 。Python没有op
可以转换x = x or y
为的单个内置运算符x op y
。
但是,几乎可以做到。如果两个操作数都被视为布尔值,请注意, 按位或等于运算符(|=
)将如上所述运行。(警告是什么?答案当然在下面。)
首先,功能的基本演示:
x = True
x
Out[141]: True
x |= True
x
Out[142]: True
x |= False
x
Out[143]: True
x &= False
x
Out[144]: False
x &= True
x
Out[145]: False
x |= False
x
Out[146]: False
x |= True
x
Out[147]: True
需要注意的是,由于python没有严格类型化,因此即使将值视为表达式中的布尔值,如果将它们提供给按位运算符,它们也不会短路。例如,假设我们有一个布尔函数,该函数清除列表并True
在删除了元素后返回:
def my_clear_list(lst):
if not lst:
return False
else:
del lst[:]
return True
现在,我们可以看到短路行为:
x = True
lst = [1, 2, 3]
x = x or my_clear_list(lst)
print(x, lst)
Output: True [1, 2, 3]
但是,将其切换or
为按位或(|
)可消除短路,因此该功能得以my_clear_list
执行。
x = True
lst = [1, 2, 3]
x = x | my_clear_list(lst)
print(x, lst)
Output: True []
以上,x = x | my_clear_list(lst)
等同于x |= my_clear_list(lst)
。