Am 01.05.2013 22:09, schrieb Eli Bendersky: > > > > On Wed, May 1, 2013 at 11:47 AM, Georg Brandl <g.bra...@gmx.net > <mailto:g.bra...@gmx.net>> wrote: > > Am 01.05.2013 20:04, schrieb Eli Bendersky: > > > Actually, in flufl.enum, IntEnum had to define a magic __value_factory__ > > attribute, but in the current ref435 implementation this isn't needed, > so > > IntEnum is just: > > > > class IntEnum(int, Enum): > > ''' > > Class where every instance is a subclass of int. > > ''' > > > > So why don't we just drop IntEnum from the API and tell users they > should > do the > > above explicitly, i.e.: > > > > class SocketFamily(int, Enum): > > AF_UNIX = 1 > > AF_INET = 2 > > > > As opposed to having an IntEnum explicitly, this just saves 2 characters > > (comma+space), but is more explicit (zen!) and helps us avoid the > special-casing > > the subclass restriction implementation. > > Wait a moment... it might not be immediately useful for IntEnums (however, > that's because base Enum currently defines __int__ which I find > questionable), > but with current ref435 you *can* create your own enum base classes with > your > own methods, and derive concrete enums from that. It also lets you have a > base class for enums and use it in isinstance(). > > If you forbid subclassing completely that will be impossible. > > > I'm not sure what you mean, Georg, could you clarify? > This works: > >>>> from ref435 import Enum >>>> class SocketFamily(int, Enum): > ... AF_UNIX = 1 > ... AF_INET = 2 > ... >>>> SocketFamily.AF_INET > SocketFamily.AF_INET [value=2] >>>> SocketFamily.AF_INET == 2 > True >>>> type(SocketFamily.AF_INET) > <Enum 'SocketFamily'> >>>> isinstance(SocketFamily.AF_INET, SocketFamily) > True > > Now, with the way things are currently implemented, class IntEnum is just > syntactic sugar for above. Guido decided against allowing any kind of > subclassing, but as an implementation need we should keep some restricted form > to implement IntEnum. But is IntEnum really needed if the above explicit > multiple-inheritance of int and Enum is possible?
Well, my point is that you currently don't have to inherit from int (or IntEnum) to get an __int__ method on your Enum, which is what I find questionable. IMO conversion to integers should only be defined for IntEnums. (But I haven't followed all of the discussion and this may already have been decided.) If __int__ stays where it is, a separate IntEnum is not necessary, but that doesn't mean that enum baseclasses aren't useful for other use cases (and they aren't hard to support, as ref435 shows.) 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