在python中做什么| =(管道相等)符号?

Tan*_*han 10 openerp python-2.7 odoo-8 odoo-9

我在一个项目中看到了一段代码,其中写了以下内容:

         move = Move.create({
            'name': repair.name,
            'product_id': repair.product_id.id,
            'product_uom': repair.product_uom.id or repair.product_id.uom_id.id,
            'product_uom_qty': repair.product_qty,
            'partner_id': repair.address_id.id,
            'location_id': repair.location_id.id,
            'location_dest_id': repair.location_dest_id.id,
            'restrict_lot_id': repair.lot_id.id,
        })
        moves |= move
        moves.action_done()
Run Code Online (Sandbox Code Playgroud)

这里的含义是什么意思?

Bil*_*lal 10

这是一个复合运算符,当你说:x |= y它相当于x = x | y

|操作装置bitwise or和它在逐位级整数操作,下面是一个例子:

a = 3    #                (011)
         #                 |||
b = 4    #                (100)
         #                 |||
a |= b   #<-- a is now 7  (111)
Run Code Online (Sandbox Code Playgroud)

另一个例子:

a = 2    #                (10)
         #                 ||
b = 2    #                (10)
         #                 ||
a |= b   #<-- a is now 2  (10)
Run Code Online (Sandbox Code Playgroud)

因此,如果在两个源中的任何一个中设置了相同的位,则结果中的每个位都将被设置,如果两个源的该位都为 0,则将设置为 0。

管道也用于集合以获取联合:

a = {1,2,3}
b = {2,3,4}
c = {4,5,6}
print(a | b | c)  # <--- {1, 2, 3, 4, 5, 6}
Run Code Online (Sandbox Code Playgroud)


CZo*_*ner 9

正如@AChampion 在第一个问题评论中已经提到的,它可以是“按位或”或“集合并”。虽然这个问题以 Odoo 作为上下文,但它是 Odoo 类的“集合并” RecordSet

对于您的示例:它与 相同,并且意味着和moves = moves | move的并集。movesmove

这个类是通过 Odoo 8 上的新 API 引入的。对于其他运算符,请查看 Odoo 的官方文档。