Barra vertical en el operador de asignación bit a bit de Python

Hay un código y en el método de la clase hay una línea:

object.attribute |= variable 

No puedo entender lo que significa. No encontré (| =) en la lista de operadores básicos de Python.

Eso es un bitwise or con asignación. Es equivalente a

 object.attribute = object.attribute | variable 

Lea más aquí .

En python, | es una mano corta para llamar al método __or__ del objeto, como se ve aquí en la documentación y en este ejemplo de código:

 class Object(object): def __or__(self, other): print("Using __or__") 

A ver que pasa cuando se usa | Operador con este objeto genérico.

 In [62]: o = Object() In [63]: o | o using __or__ 

Como se puede ver, se __or__ método __or__ . int , ‘set’, ‘bool’ tienen una implementación de __or__ . Para números y números, es un OR a nivel de bits. Para conjuntos, es un sindicato. Entonces, dependiendo del tipo de atributo o variable, el comportamiento será diferente. Muchos de los operadores bit a bit han establecido equivalentes, vea más aquí .

Debo agregar que “barra igual” es ahora (en 2018) el más popularmente utilizado como operador de unión de conjuntos para agregar elementos a un conjunto si aún no están allí.

 >>> a = {'a', 'b'} >>> a set(['a', 'b']) >>> b = {'b', 'c'} >>> b set(['c', 'b']) >>> a |= b >>> a set(['a', 'c', 'b']) 

Un caso de uso para esto, por ejemplo, en el procesamiento de lenguaje natural, es extraer el alfabeto combinado de varios idiomas:

 alphabet |= {unigram for unigram in texts['en']} alphabet |= {unigram for unigram in texts['de']} ... 

Para un entero, esto correspondería al método “bitwise o” de Python. Entonces, en el siguiente ejemplo, tomamos el bit a bit o de 4 y 1 para obtener 5 (o en binario 100 | 001 = 101):

 Python 3.5.2 (default, Nov 17 2016, 17:05:23) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> a = 4 >>> bin(a) '0b100' >>> a |= 1 >>> bin(a) '0b101' >>> a 5 

Más generalizado (como dice Alejandro) es llamar a un objeto o método, que se puede definir para una clase en la forma:

 def __or__(self, other): # your logic here pass 

Entonces, en el caso específico de un entero, estamos llamando al método o que se resuelve en un bit a bit o, como lo define Python.