On Fri, Sep 18, 2020 at 6:19 PM Ethan Furman <et...@stoneleaf.us> wrote:

> On 9/18/20 3:12 PM, Guido van Rossum wrote:
>  > On 9/18/20 2:44 PM, Ethan Furman wrote:
>
>  >> I'm looking for arguments relating to:
>  >>
>  >> - should _convert_ make the default __repr__ be
>  >>   module_name.member_name?
>  >
>  > I actually like the status quo for regular enums, when repr() shows
>  > the type, name and value, and str() shows "classname.flagname", so I'd
>  > stick to that for converted flags. Even though this violates the rule
>  > of thumb that repr() should look like a valid expression -- perhaps a
>  > stronger rule of thumb is that repr() should show more than str().
>
> Well, if the repr is re.IGNORECASE and the str is 2, then we've met that
> bar.  ;-)
>
>  >> - should _convert_ make the default __str__ be the same, or be the
>  >>   numeric value?
>  >
>  > Showing just (the str of) the value seems unkind, since e.g. showing
>  > '4' makes me think it's just an int. (Then again I can see that for
>  > *converted* flags that's not unreasonable.)
>  >
>  > But yeah, backwards compatibility. However, I don't think we got any
>  > complaints about the `re` flags, did we?
>
> The only complaints I'm aware of were before the re constants became an
> Enum, but my social media activity consists almost entirely of
> Stackoverflow.
>

:-)

So at this point, I think the choices are:
>
> Standard Enum
>        __repr__                   __str__
> <RegexFlag.IGNORECASE: 2>   RegexFlag.IGNORECASE
>
> and
>
> Modified Converted Constant
>        __repr__                   __str__
> re.IGNORECASE                       2
>
>
> I will admit I fancy the MCC variant more, but we should make a choice
> and then be consistent.
>

Hm, there's also what re actually does (tried in 3.8, 3.9 and 3.10):
```
>>> import re
>>> print(str(re.I))
RegexFlag.IGNORECASE
>>> print(repr(re.I))
re.IGNORECASE
>>>
```
I honestly think we've already lost consistency.

Possibly regular enums (Enum, IntEnum, IntFlag) should just all return "
class.name", e.g. 'Color.RED', for both str() and repr(), and "converted"
enums should return "module.name", e.g. 're.IGNORE' for both? It restores
the rule of thumb, and it's not unusual. Maybe it's a new trend -- PEP
585's list[int] returns "list[int]" for both str() and repr(). :-)

At the same time it's as old as Python -- for most builtins other than
strings, repr() and str() are the same, and modeled after repr().
Historically, I only introduced the difference between str() and repr()
because of strings -- I wanted the REPL to clearly show the difference
between the number 42 and the string '42', but at the same time I wanted
both to print as just '42'. Of course numpy took a different fork in that
road...

Another brainstorm (or brainfart): maybe repr() should show the
module/class and the name, and str() should only show the name. We'd then
get
```
>>> # Mock-up!
>>> print(str(re.i))
IGNORE
>>> print(repr(re.i))
re.IGNORE
>>>
```
and similar for Color.RED:
```
>>> # Another mock-up!
>>> print(str(Color.RED))
RED
>>> print(repr(Color.RED))
Color.RED
>>>
```

-- 
--Guido van Rossum (python.org/~guido)
*Pronouns: he/him **(why is my pronoun here?)*
<http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/>
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/5CB22SIQQX3EWIOTIIPLWKMNWFZOVSAH/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to