<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>