[Python-ideas] Change magic strings to enums

Nick Coghlan ncoghlan at gmail.com
Thu Apr 26 09:26:52 EDT 2018


On 26 April 2018 at 19:37, Jacco van Dorp <j.van.dorp at deonet.nl> wrote:
> I'm kind of curious why everyone here seems to want to use IntFlags
> and other mixins. The docs themselves say that their use should be
> minimized, and tbh I agree with them. Backwards compatiblity can be
> maintained by allowing the old value and internally converting it to
> the enum. Combinability is inherent to enum.Flags. There'd be no real
> reason to use mixins as far as I can see ?

Serialisation formats are a good concrete example of how problems can
arise by switching out concrete types on people:

>>> import enum, json
>>> a = "A"
>>> class Enum(enum.Enum):
...     a = "A"
...
>>> class StrEnum(str, enum.Enum):
...     a = "A"
...
>>> json.dumps(a)
'"A"'
>>> json.dumps(StrEnum.a)
'"A"'
>>> json.dumps(Enum.a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python3.6/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib64/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib64/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib64/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'Enum' is not JSON serializable

The mixin variants basically say "If you run into code that doesn't
natively understand enums, act like an instance of this type".

Since most of the standard library has been around for years, and
sometimes even decades, we tend to face a *lot* of backwards
compatibility requirements along those lines.

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia


More information about the Python-ideas mailing list