Vertical bar in Python bitwise assignment operator

前端 未结 4 784
情话喂你
情话喂你 2020-12-17 09:07

There is a code and in class\' method there is a line:

object.attribute |= variable

I can\'t understand what it means. I didn\'t find (|=)

相关标签:
4条回答
  • 2020-12-17 09:12

    That is a bitwise or with assignment. It is equivalent to

    object.attribute = object.attribute | variable
    

    Read more here.

    0 讨论(0)
  • 2020-12-17 09:17

    For an integer this would correspond to Python's "bitwise or" method. So in the below example we take the bitwise or of 4 and 1 to get 5 (or in binary 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
    

    More generalised (as Alejandro says) is to call an object's or method, which can be defined for a class in the form:

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

    So in the specific case of an integer, we are calling the or method which resolves to a bitwise or, as defined by Python.

    0 讨论(0)
  • 2020-12-17 09:21

    In python, | is short hand for calling the object's __or__ method, as seen here in the docs and this code example:

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

    Let's see what happens when use | operator with this generic object.

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

    As you can see the, the __or__ method was called. int, 'set', 'bool' all have an implementation of __or__. For numbers and bools, it is a bitwise OR. For sets, it's a union. So depending on the type of the attribute or variable, the behavior will be different. Many of the bitwise operators have set equivalents, see more here.

    0 讨论(0)
  • 2020-12-17 09:22

    I should add that "bar-equals" is now (in 2018) most popularly used as a set-union operator to append elements to a set if they're not there yet.

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

    One use-case for this, say, in natural language processing, is to extract the combined alphabet of several languages:

    alphabet |= {unigram for unigram in texts['en']}
    alphabet |= {unigram for unigram in texts['de']}
    ...
    
    0 讨论(0)
提交回复
热议问题