Python中是否有像"| ="这样的"或等于"函数?

Sea*_* W. 71 ruby python

如果没有,最好的方法是什么?

现在我正在做(对于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)

  • 这个答案很可能就是那些来自谷歌搜索的人们正在寻找的. (32认同)
  • 请注意,与Ruby不同,此代码仅在先前已定义`x`时才起作用(例如,在类初始化方法中设置为`None`). (6认同)
  • 没错,这与Ruby的|| =完全不同.需要注意的另一件事是x的"真实性".如果在Python中x == 0,你会得到new_value,因为0被认为是假的,但在Ruby中你会得到0. (3认同)

Jon*_*ric 16

dictsetdefault().

所以如果request.sessiondict:

request.session.setdefault('thing_for_purpose', 5)
Run Code Online (Sandbox Code Playgroud)

  • 有点相似,但绝不等同于 Ruby 的 ||=。 (3认同)

Bri*_*cks 9

如果您在中间件或其他东西中执行此操作,则设置默认值是有意义的,但如果您在一个请求的上下文中需要默认值:

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)


Apo*_*ica 9

准确答案: 不会.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).