如果没有,什么是最好的方法?
现在我正在做(对于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)。