> On Feb 20, 2015, at 8:54 AM, Brett Cannon <br...@python.org> wrote:
> Concrete reason. The string is 'MyEnum.FOO' which is much more readable and 
> obvious where the value came from. The fact that it can be treated as an int 
> is the same as the reason True and False are subclasses of int; it made 
> practical sense for compatibility with what they typically replaced, but 
> where it made more sense to diverge and introduce new behaviour then we did 
> so.

Thanks Brett, that makes sense and was pretty much what I assumed. Reading the 
docs for __str__ does clarify things a bit in that the intention is to be a 
string representation of the object and not the value. That said, 
implementations seem to vary throughout the standard library and builtins:

>>> str(uuid.uuid4())
'd467d97c-fc09-4dc9-bea5-aeebdad8df8d’
>>> str(int())
‘0'
>>> str(datetime.datetime.now())
'2015-02-20 09:31:28.385539’
>>> str(IPv4Address('127.0.0.1'))
'127.0.0.1'

These and other implementations return a string representation of the 
instance’s value, not a string representation of the object itself. Whereas 
elsewhere in the standard library:

>>> str(ProtocolError('url', 42, 'msg', ''))
'<ProtocolError for url: 42 msg>’
>>> str(URLError('reason'))
'<urlopen error reason>’
>>> str(Cookie(0, '', '', '4', '', '', '', '', '', '', '', 0, '', '', '', ''))
'<Cookie = for :4>'

The specific problem that I encountered was when swapping an IntEnum 
implementation for ints in http.client, which caused a change in logging output 
(from int.__str__ to Enum.__str__), which was a bit of a surprise, especially 
given the value is a builtin type.

I think that a decent rule around the usage of __str__ is that it should be a 
string representation of the value, not of the object. Failing the ability to 
logically coerce the value to a string, it should simply fall back to repr(obj).

Of course, I realize that the chances of this change being made to such a 
fundamental (and largely inconsequential) feature are likely nil, but I thought 
I’d share my thoughts anyways.

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to