103

I see a "pipe" character (|) used in a function call:

res = c1.create(go, come, swim, "", startTime, endTime, "OK", ax|bx)

What is the meaning of the pipe in ax|bx?

Johannes Weiss
  • 50,352
  • 15
  • 99
  • 134
alwbtc
  • 25,815
  • 57
  • 129
  • 182

6 Answers6

173

This is also the union set operator

set([1,2]) | set([2,3])

This will result in set([1, 2, 3])

Jean-François Corbett
  • 36,032
  • 27
  • 135
  • 183
gui11aume
  • 2,400
  • 3
  • 16
  • 21
76

It is a bitwise OR of integers. For example, if one or both of ax or bx are 1, this evaluates to 1, otherwise to 0. It also works on other integers, for example 15 | 128 = 143, i.e. 00001111 | 10000000 = 10001111 in binary.

Marc Mutz - mmutz
  • 23,707
  • 11
  • 74
  • 87
ahmet alp balkan
  • 39,078
  • 36
  • 125
  • 203
  • 5
    Python does not have a logical or operator. – Ignacio Vazquez-Abrams May 13 '11 at 07:34
  • How about when I type 5|7 in the shell? It returns 7. why? – alwbtc May 13 '11 at 08:10
  • Because that's what bitwise OR does. – Ignacio Vazquez-Abrams May 13 '11 at 08:11
  • 2
    `5 = 101`, `7 = 111`, `101 | 111 = 111 = 7` – Paul R May 13 '11 at 08:13
  • 17
    @Ignacio: Python does not have a logical or operator?! What do you call [`or`](http://docs.python.org/reference/expressions.html#boolean-operations), then? – jscs May 13 '11 at 08:27
  • 2
    @Ignacio are you referring to it as a null coalescing operator (like in C#/Perl)? Never heard of it referred to that way, but if I understand correctly, that does make sense in a way since it's a short-circuit operator. Is that what you were referring to (do I understand you properly)? – zeekay May 13 '11 at 09:28
  • 25
    @zeekay: Correct. Rather than always returning `True` or `False`, `and` and `or` always return one of their operands, hence "coalescing" rather than "logical". – Ignacio Vazquez-Abrams May 13 '11 at 09:30
  • 1
    It's not strictly bitwise. `(True | False) is True` whereas `(True | 0) is not True`. There are different overloadings of `|` in python 2.6 depending on whether the arguments are the special integral values `(True, False)` vs regular integral values. – Mike Samuel Mar 05 '12 at 18:14
  • 5
    What Mike said. More generally, it calls the `__or__` method of the first operand with the second operand, so you can define its behavior for your own classes. – Denis Drescher May 26 '15 at 11:52
27

Yep, all answers above are correct.

Although you could find more exotic use cases for "|", if it is an overloaded operator used by a class, for example,

https://github.com/twitter/pycascading/wiki#pycascading

input = flow.source(Hfs(TextLine(), 'input_file.txt'))
output = flow.sink(Hfs(TextDelimited(), 'output_folder'))

input | map_replace(split_words, 'word') | group_by('word', native.count()) | output

In this specific use case pipe "|" operator can be better thought as a unix pipe operator. But I agree, bit-wise operator and union set operator are much more common use cases for "|" in Python.

Tagar
  • 12,247
  • 5
  • 84
  • 103
18

In Python 3.9 - PEP 584 - Add Union Operators To dict in the section titled Specification, the operator is explained. The pipe was enhanced to merge (union) dictionaries.

>>> d = {'spam': 1, 'eggs': 2, 'cheese': 3}
>>> e = {'cheese': 4, 'nut': 5}
>>> d | e
{'spam': 1, 'eggs': 2, 'cheese': 4, 'nut': 5} # comment 1
>>> e | d
{'cheese': 3, 'nut': 5, 'spam': 1, 'eggs': 2} # comment 2

comment 1 If a key appears in both operands, the last-seen value (i.e. that from the right-hand operand) wins --> 'cheese': 4 instead of 'cheese': 3

comment 2 cheese appears twice, the second value is selected so d[cheese]=3

BrokenBenchmark
  • 13,997
  • 5
  • 12
  • 27
user12989841
  • 181
  • 1
  • 3
11

Bitwise OR.

Ignacio Vazquez-Abrams
  • 740,318
  • 145
  • 1,296
  • 1,325
6

It is a bitwise-or.

The documentation for all operators in Python can be found in the Index - Symbols page of the Python documentation.

tzot
  • 87,612
  • 28
  • 135
  • 198