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

时间:2010-10-14 01:34:36

标签: python ruby

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

现在我正在做(对于django项目):

if not 'thing_for_purpose' in request.session:
    request.session['thing_for_purpose'] = 5

但它非常尴尬。在Ruby中它将是:

request.session['thing_for_purpose'] ||= 5

更好。

5 个答案:

答案 0 :(得分:155)

接受的答案对于dicts来说是好的,但是标题寻求一般等同于Ruby的|| =运算符。在Python中执行类似|| =的常见方法是

x = x or new_value

答案 1 :(得分:14)

dictsetdefault()

所以,如果request.sessiondict

request.session.setdefault('thing_for_purpose', 5)

答案 2 :(得分:9)

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

request.session.get('thing_for_purpose', 5) # gets a default

奖励:这是如何在Python中真正做||=

def test_function(self, d=None):
    'a simple test function'
    d = d or {}

    # ... do things with d and return ...

答案 3 :(得分:5)

准确答案:否。 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)

答案 4 :(得分:0)

通常,您可以使用dict[key] = dict.get(key, 0) + val