如果没有,最好的方法是什么?
现在我正在做(对于django项目):
if not 'thing_for_purpose' in request.session:
request.session['thing_for_purpose'] = 5
Run Code Online (Sandbox Code Playgroud)
但它很尴尬.在Ruby中它将是:
request.session['thing_for_purpose'] ||= 5
Run Code Online (Sandbox Code Playgroud)
这更好.
Jos*_*edy 169
接受的答案对于dicts是好的,但是标题寻求与Ruby的|| =运算符相当的一般性.在Python中执行类似|| =的常见方法是
x = x or new_value
Run Code Online (Sandbox Code Playgroud)
Jon*_*ric 16
dict有setdefault().
所以如果request.session是dict:
request.session.setdefault('thing_for_purpose', 5)
Run Code Online (Sandbox Code Playgroud)
如果您在中间件或其他东西中执行此操作,则设置默认值是有意义的,但如果您在一个请求的上下文中需要默认值:
request.session.get('thing_for_purpose', 5) # gets a default
Run Code Online (Sandbox Code Playgroud)
奖励:这是如何||=在Python中真正做到的.
def test_function(self, d=None):
'a simple test function'
d = d or {}
# ... do things with d and return ...
Run Code Online (Sandbox Code Playgroud)
准确答案: 不会.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
Run Code Online (Sandbox Code Playgroud)
需要注意的是python不是严格类型的,因此即使将值视为表达式中的布尔值,如果给予按位运算符,它们也不会被短路.例如,假设我们有一个布尔函数,它清除一个列表并返回True如果删除了元素:
def my_clear_list(lst):
if not lst:
return False
else:
del lst[:]
return True
Run Code Online (Sandbox Code Playgroud)
现在我们可以看到短路行为:
x = True
lst = [1, 2, 3]
x = x or my_clear_list(lst)
print(x, lst)
Output: True [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
但是,切换or到按位或(|)会消除短路,因此函数会my_clear_list执行.
x = True
lst = [1, 2, 3]
x = x | my_clear_list(lst)
print(x, lst)
Output: True []
Run Code Online (Sandbox Code Playgroud)
以上,x = x | my_clear_list(lst)相当于x |= my_clear_list(lst).