That would be more palatable if it wasn't so common to use manually assigned numerical values (as most of the examples in the enum module docs do) or the default auto().

I'm just trying to present an argument that if the str() of an enum was its name and the repr() was its "full name" (at least including the class) that would be pretty sweet.

On Sat, Sep 19, 2020 at 1:02 PM Ethan Furman <ethan@stoneleaf.us> wrote:
On 9/19/20 11:32 AM, Guido van Rossum wrote:
 > On Sat, Sep 19, 2020 at 1:29 AM Ethan Furman wrote:
 >> On 9/18/20 6:41 PM, Guido van Rossum wrote:

 >>> 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
 >>>  >>>
 >>> ```
 >>
 >> I think that's too terse -- the first bit, whether class or module,
 >> repr or str, is very important -- especially if you have several
 >> enums using some of the same names for their members.
 >
 > Hm, the more I think about it the more I like this proposal. :-)
 >
 > When exploring in the REPL, my proposal *would* show the class name
 > (but not the module name -- one can cause obfuscation that way too,
 > but it would become unwieldy, and the custom seems to be to stop
 > short of that).
 >
 > But when printing casually, wouldn't it be nice if we could cause
 > end-user-friendly output to be produced by default? End users probably
 > don't care about the class name, but they would care about the color
 > name. E.g.
 >
 > class Color(Enum):
 >      red = 0
 >      green = 1
 >      blue = 2
 >
 > class Flowers(Enum):
 >      roses = 0
 >      violets = 1
 >
 > def send_bouquet(flowers, color):
 >      print("I'm sending you a bouquet of", color, flowers)

That's a fun example -- but member names are supposed to be UPPER_CASE,
so your string would be, for example:

     I'm sending you a bouquet of RED VIOLETS

Of course, if we went with the idea of __str__ just returning the value,
then:

   class Color(Enum):
       RED = 'red'
       GREEN = 'green'
       BLUE = 'blue'

   class Flowers(Enum):
       ROSES = 'roses'
       VIOLETS = violets'

which would indeed give us:

     I'm sending you a bouquet of red violets

and the above enums could be even simpler if using enum.auto() and a
custom NamedEnum:

   class NamedEnum(Enum):
       """
       member values are the lower-cased member names
       """
       def _generate_next_value_(name, start, count, last_values):
           return name.lower()

   class Flowers(NamedEnum):
       ROSES = auto()
       VIOLETS = auto()

--
~Ethan~
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-leave@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/QJX2D56FEEMQ5OFJPB5ASXAUM3GUWRPG/
Code of Conduct: http://python.org/psf/codeofconduct/


--
--Guido van Rossum (python.org/~guido)
Pronouns: he/him (why is my pronoun here?)