[Python-Dev] AutoNumber Enum
Ivan Levkivskyi
levkivskyi at gmail.com
Wed Jun 29 16:01:11 EDT 2016
It looks like the values in AutoNumberEnum are consecutive integers
1,2,3,...
Have you considered an option (keyword argument) to change this to powers
of two 1,2,4,8,...?
--
Ivan
On 29 June 2016 at 21:23, Ethan Furman <ethan at stoneleaf.us> wrote:
> On 06/29/2016 12:11 PM, Guido van Rossum wrote:
>
> And how would you implement that without support from the compiler?
>> Does it use a hook that catches the NameError?
>>
>
> It's built into the _EnumDict class dictionary used during class creation.
>
> Current (edited) code from the aenum package that implements this:
>
> class _EnumDict(dict):
> """Track enum member order and ensure member names are not reused.
>
> EnumMeta will use the names found in self._member_names as the
> enumeration member names.
> """
> def __init__(self, locked=True, start=1, multivalue=False):
> super(_EnumDict, self).__init__()
> # list of enum members
> self._member_names = []
> # starting value for AutoNumber
> self._value = start - 1
> # when the magic turns off
> self._locked = locked
> ...
>
> def __getitem__(self, key):
> if (
> self._locked
> or key in self
> or _is_sunder(key)
> or _is_dunder(key)
> ):
> return super(_EnumDict, self).__getitem__(key)
> try:
> # try to generate the next value
> value = self._value + 1
> self.__setitem__(key, value)
> return value
> except:
> # couldn't work the magic, report error
> raise KeyError('%s not found' % key)
>
> def __setitem__(self, key, value):
> """Changes anything not sundured, dundered, nor a descriptor.
> Single underscore (sunder) names are reserved.
> """
> if _is_sunder(key):
> raise ValueError('_names_ are reserved for future Enum use')
> elif _is_dunder(key):
> if key == '__order__':
> key = '_order_'
> if _is_descriptor(value):
> self._locked = True
> elif key in self._member_names:
> # descriptor overwriting an enum?
> raise TypeError('Attempted to reuse name: %r' % key)
> elif not _is_descriptor(value):
> if key in self:
> # enum overwriting a descriptor?
> raise TypeError('%s already defined as: %r' % ...
> self._member_names.append(key)
> if not self._locked:
> if isinstance(value, int):
> self._value = value
> else:
> count = self._value + 1
> self._value = count
> value = count, value
> else:
> # not a new member, turn off the autoassign magic
> self._locked = True
> super(_EnumDict, self).__setitem__(key, value)
>
> Disclaimer: some errors may have crept in as I deleted unrelated
> content. For the full code check out the _EnumDict class in the aenum
> package.
>
> --
> ~Ethan~
>
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> https://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe:
> https://mail.python.org/mailman/options/python-dev/levkivskyi%40gmail.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20160629/0815602a/attachment.html>
More information about the Python-Dev
mailing list