Am 01.05.2013 23:19, schrieb Eli Bendersky: > It's a common pattern to do this with a base class rather than a > mixin, though, and I think the rule "only allow subclassing empty > enums" makes a lot of sense. > > > I see your point (and Antoine's example in the next email is good), but my > concern is that this is a TIMTOWTDI thing, since the same can be achieved with > mixins. Specifically, Antoine's example > becomes: > > class IETFStatusCode: > @classmethod > def from_statusline(cls, line): > return cls(int(line.split()[0])) > > class HTTPStatusCode(int, IETFStatusCode, Enum): > NOT_FOUND = 404 > > class SIPStatusCode(int, IETFStatusCode, Enum): > RINGING = 180
Now try it like this: class SIPStatusCode(IETFStatusCode, int, Enum): RINGING = 180 and you'll get Traceback (most recent call last): File "/home/gbr/devel/ref435/ref435.py", line 84, in __new__ enum_item = obj_type.__new__(result, value) TypeError: object.__new__(SIPStatusCode) is not safe, use int.__new__() During handling of the above exception, another exception occurred: Traceback (most recent call last): File "ex.py", line 11, in <module> class SIPStatusCode(IETFStatusCode, int, Enum): File "/home/gbr/devel/ref435/ref435.py", line 86, in __new__ raise EnumError(*exc.args) from None TypeError: exception causes must derive from BaseException > Same thing, while keeping the stdlib API cleaner and more minimal. Cleaner > because "no subclassing" is a simpler, more explicit, and easier to understand > rule than "no subclassing unless base class is devoid of enumeration values". > And because we can no longer say "Enum classes are final", which is a > relatively > familiar and understood semantic. I fear the "you can use mixins provided you put them in the right spot in the base classes list" rule is not much simpler than the "no subclassing of enums with values" rule. Georg _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com