◐ Shell
clean mode source ↗

bpo-40066: Enum: modify `repr()` and `str()` by ethanfurman · Pull Request #22392 · python/cpython

gvanrossum

serhiy-storchaka

iritkatriel

non-StrEnum `__str__` will print the member name
StrEnum `__str__` will print the member value
create enum._stdlib_enum decorator for Enums created the normal way: it
adjusts `__repr__` and `__str__` to be the same as if the Enum had been
created using `_convert_`

update various modules to use the new decorator
if `enum.__str__` is either `Enum.__str__` or `global_enum_str` use the
value's `__format__`
repr() = class.member_name
str() = member_name
rename to `global_enum` and have `global_enum` update the module's
namespace with the members

remove `_stdlib_enum` where the enums were not being exported to the
module's namespace
* rename global_int_repr --> global_enum_repr
* adjust global_flag_repr to print hex number for out-of-range values
* extract function when _generate_next_value_ is a static method
- repr() is now ``enum_class.member_name``
- str() is now ``member_name``
- add HOW-TO section for ``Enum``
- change main documentation to be an API reference

@ethanfurman

@ethanfurman ethanfurman changed the title bpo-40066: Enum global repr() and str() bpo-40066: Enum: modify repr() and str()

Mar 31, 2021

@ethanfurman

tacaswell added a commit to tacaswell/matplotlib that referenced this pull request

May 4, 2021
In Python 3.10 the repr and str representation of Enums changed from

 str: 'ClassName.NAME' -> 'NAME'
 repr: '<ClassName.NAME: value>' -> 'ClassName.NAME'

which is more consistent with what str/repr should do, however this breaks
boilerplate which needs to get the ClassName.NAME version in all versions of
Python. Thus, we locally monkey patch our preferred str representation in
here.

bpo-40066
python/cpython#22392

tacaswell added a commit to tacaswell/matplotlib that referenced this pull request

May 4, 2021
In Python 3.10 the repr and str representation of Enums changed from

 str: 'ClassName.NAME' -> 'NAME'
 repr: '<ClassName.NAME: value>' -> 'ClassName.NAME'

which is more consistent with what str/repr should do, however this breaks
boilerplate which needs to get the ClassName.NAME version in all versions of
Python. Thus, we locally monkey patch our preferred str representation in
here.

bpo-40066
python/cpython#22392