[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