<div dir="ltr"><div><div>It looks like the values in AutoNumberEnum are consecutive integers 1,2,3,...<br></div>Have you considered an option (keyword argument) to change this to powers of two 1,2,4,8,...?<br><br>--<br></div>Ivan<br><br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On 29 June 2016 at 21:23, Ethan Furman <span dir="ltr"><<a href="mailto:ethan@stoneleaf.us" target="_blank">ethan@stoneleaf.us</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 06/29/2016 12:11 PM, Guido van Rossum wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
And how would you implement that without support from the compiler?<br>
Does it use a hook that catches the NameError?<br>
</blockquote>
<br></span>
It's built into the _EnumDict class dictionary used during class creation.<br>
<br>
Current (edited) code from the aenum package that implements this:<br>
<br>
class _EnumDict(dict):<br>
"""Track enum member order and ensure member names are not reused.<br>
<br>
EnumMeta will use the names found in self._member_names as the<br>
enumeration member names.<br>
"""<br>
def __init__(self, locked=True, start=1, multivalue=False):<br>
super(_EnumDict, self).__init__()<br>
# list of enum members<br>
self._member_names = []<br>
# starting value for AutoNumber<br>
self._value = start - 1<br>
# when the magic turns off<br>
self._locked = locked<br>
...<br>
<br>
def __getitem__(self, key):<br>
if (<br>
self._locked<br>
or key in self<br>
or _is_sunder(key)<br>
or _is_dunder(key)<br>
):<br>
return super(_EnumDict, self).__getitem__(key)<br>
try:<br>
# try to generate the next value<br>
value = self._value + 1<br>
self.__setitem__(key, value)<br>
return value<br>
except:<br>
# couldn't work the magic, report error<br>
raise KeyError('%s not found' % key)<br>
<br>
def __setitem__(self, key, value):<br>
"""Changes anything not sundured, dundered, nor a descriptor.<br>
Single underscore (sunder) names are reserved.<br>
"""<br>
if _is_sunder(key):<br>
raise ValueError('_names_ are reserved for future Enum use')<br>
elif _is_dunder(key):<br>
if key == '__order__':<br>
key = '_order_'<br>
if _is_descriptor(value):<br>
self._locked = True<br>
elif key in self._member_names:<br>
# descriptor overwriting an enum?<br>
raise TypeError('Attempted to reuse name: %r' % key)<br>
elif not _is_descriptor(value):<br>
if key in self:<br>
# enum overwriting a descriptor?<br>
raise TypeError('%s already defined as: %r' % ...<br>
self._member_names.append(key)<br>
if not self._locked:<br>
if isinstance(value, int):<br>
self._value = value<br>
else:<br>
count = self._value + 1<br>
self._value = count<br>
value = count, value<br>
else:<br>
# not a new member, turn off the autoassign magic<br>
self._locked = True<br>
super(_EnumDict, self).__setitem__(key, value)<br>
<br>
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.<br>
<br>
--<br>
~Ethan~<div class="HOEnZb"><div class="h5"><br>
_______________________________________________<br>
Python-Dev mailing list<br>
<a href="mailto:Python-Dev@python.org" target="_blank">Python-Dev@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-dev" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-dev</a><br>
Unsubscribe: <a href="https://mail.python.org/mailman/options/python-dev/levkivskyi%40gmail.com" rel="noreferrer" target="_blank">https://mail.python.org/mailman/options/python-dev/levkivskyi%40gmail.com</a><br>
</div></div></blockquote></div><br></div>