[issue30435] Documentation either unclear or incorrect on comparisons between bytes and strings in Python 3

New submission from ipatrol:
https://docs.python.org/3/reference/expressions.html#comparisons says that "Strings and binary sequences cannot be directly compared." That would seem to me to imply that an equality between them would raise an exception, as also claimed by https://wiki.python.org/moin/BytesStr
However, that is manifestly incorrect. Bytes and strings can be compared: they are always unequal. This appears to be a result of the operation falling through to the default comparison, which returns False since they are not identical objects. Equality is a comparison, though it is not an order comparison. A brief search of the word "cannot" in the documentation suggest that saying a certain thing cannot be done usually implies that attempting to do so anyway will raise an exception, typically a TypeError. That this is not the case for string-bytes comparisons should be mentioned.
---------- assignee: docs@python components: Documentation messages: 294200 nosy: docs@python, ipatrol priority: normal severity: normal status: open title: Documentation either unclear or incorrect on comparisons between bytes and strings in Python 3 type: behavior versions: Python 3.3, Python 3.4, Python 3.5, Python 3.6, Python 3.7
_______________________________________ Python tracker report@bugs.python.org http://bugs.python.org/issue30435 _______________________________________

Changes by Mariatta Wijaya mariatta.wijaya@gmail.com:
---------- versions: -Python 3.4, Python 3.5
_______________________________________ Python tracker report@bugs.python.org http://bugs.python.org/issue30435 _______________________________________

Changes by Mariatta Wijaya mariatta.wijaya@gmail.com:
---------- versions: +Python 2.7, Python 3.5 -Python 3.3
_______________________________________ Python tracker report@bugs.python.org http://bugs.python.org/issue30435 _______________________________________

Eryk Sun added the comment:
How about "cannot be compared by value" or "cannot be ordered by value"? Emphasizing the value aspect doesn't conflict with the default equality comparison by identity.
Note that starting Python with the -b option causes the bytes type to raise a warning in this case:
>>> sys.flags.bytes_warning 1 >>> 'a'.__eq__(b'a') NotImplemented
>>> b'a'.__eq__('a') __main__:1: BytesWarning: Comparison between bytes and string NotImplemented
---------- nosy: +eryksun
_______________________________________ Python tracker report@bugs.python.org http://bugs.python.org/issue30435 _______________________________________

Martin Panter added the comment:
Also, “-bb” turns it into an exception, and the same applies to bytes vs int:
b"a" == "a"
Traceback (most recent call last): File "<stdin>", line 1, in <module> BytesWarning: Comparison between bytes and string
b"a" == 0x61
Traceback (most recent call last): File "<stdin>", line 1, in <module> BytesWarning: Comparison between bytes and int
Perhaps the documentation should say “should not be compared” rather than “cannot”. Or perhaps it should mention “-b”.
Mariatta: I don’t think this is relevant to 2.7. In 2.7, you do get an error with bytearray vs unicode, but bytearray is not discussed in this bit of the Py 2 documentation.
---------- nosy: +Mariatta, martin.panter
_______________________________________ Python tracker report@bugs.python.org http://bugs.python.org/issue30435 _______________________________________

Changes by Mariatta Wijaya mariatta.wijaya@gmail.com:
---------- versions: -Python 2.7
_______________________________________ Python tracker report@bugs.python.org http://bugs.python.org/issue30435 _______________________________________

Brian Ward added the comment:
The "should" recommendation seems like the right direction, but feels like it needs an explanation (in case someone's trying to run some 2.7 code and is wondering why their comparisons don't work anymore). Unfortunately, it's a little complicated to pile into a section like this. Putting it somewhere else (that includes a reference to -b) might work.
A somewhat related aside is that I've sometimes thought that there ought to be something a little more extensive regarding converting bytes to strings, as it's the kind of thing that can lead you down this road anyway.
---------- nosy: +Brian Ward
_______________________________________ Python tracker report@bugs.python.org http://bugs.python.org/issue30435 _______________________________________

Change by Eryk Sun eryksun@gmail.com:
---------- type: behavior -> enhancement versions: +Python 3.10, Python 3.8, Python 3.9 -Python 3.5, Python 3.6, Python 3.7
_______________________________________ Python tracker report@bugs.python.org https://bugs.python.org/issue30435 _______________________________________
participants (5)
-
Brian Ward
-
Eryk Sun
-
ipatrol
-
Mariatta Wijaya
-
Martin Panter