4 ms·
> .encode() and .decode() are so ambiguous and unintuitive They are not. What is unintuitive is the default encoding in Python where an encode can trigger an i
by the_mitsuhiko 11y ago
> .encode() and .decode() are so ambiguous and unintuitive
They are not. What is unintuitive is the default encoding in Python where an encode can trigger an implicit encode and the other way round. The `encode()`/`decode()` availability of strings was never a problem has you have many bytes -> bytes and str -> str codecs;
- bpicolo 11y agoDisagree. The original commenter is correct in saying that the naming scheme is not obvious. Something like to_bytes(encoding) would be a lot more clear.
- the_mitsuhiko 11y ago> Disagree. The original commenter is correct in saying that the naming scheme is not obvious. Something like to_bytes(encoding) would be a lot more clear. But then function would do something completely different. "\x01\x02".encode('zlib') for instance is a bytes to bytes operation. The problem is that "foo".encode('utf-8') does not give you an exception. If the coercion would not be enabled you would get an error: >>> reload(sys).setdefaultencoding('undefined') >>> 'foo'.encode('utf-8') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/Cellar/python/.../encodings/undefined.py", line 22, in decode raise UnicodeError("undefined encoding") UnicodeError: undefined encoding That's not any worse than what Python 3 does: >>> b'foo'.encode('utf-8') Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'bytes' object has no attribute 'encode'
- kenko 11y ago> "\x01\x02".encode('zlib') for instance is a bytes to bytes operation. I think the inclusion of things like zlib (or rot13 or whatever) was a conceptual error that just fosters confusion.
- the_mitsuhiko 11y ago> I think the inclusion of things like zlib (or rot13 or whatever) was a conceptual error that just fosters confusion. We should not optimize languages for idiots. There is nothing confusing about such an operation for anyone who can use their brain. Python 3 still contains those operations but instead of x.encode(y) you now do encode(x, y).
- bpicolo 11y agoThe principle of least astonishment and optimizing for idiocy are not the same thing.
- the_mitsuhiko 11y agoHow is an attribute error clearer than an exception that says something like: operation does not make sense of this type?
- bronson 11y ago"\x01\x02".encode('zlib') is a really odd API. Just making sure: this is a real thing, and you're in favor of it?
- the_mitsuhiko 11y ago> "\x01\x02".encode('zlib') is a really odd API. Just making sure: this is a real thing, and you're in favor of it? Of course this is a real thing and it's very frequently used. Yes I am in favour of it as the codec system in Python is precisely the place where things like this should live.
- tveita 11y agoIt is in Python 2, but not in Python 3, where str.encode() and bytes.decode() have been restricted to only convert between strings and bytes. >>> "foo".encode('zlib') LookupError: 'zlib' is not a text encoding; use codecs.encode() to handle arbitrary codecs