def test_is_descriptor(self): class foo: pass for attr in ('__get__','__set__','__delete__'): obj = foo() self.assertFalse(enum._is_descriptor(obj)) setattr(obj, attr, 1) self.assertTrue(enum._is_descriptor(obj))
def test_is_descriptor(self): class foo: pass for attr in ('__get__', '__set__', '__delete__'): obj = foo() self.assertFalse(enum._is_descriptor(obj)) setattr(obj, attr, 1) self.assertTrue(enum._is_descriptor(obj))
def __setitem__(self, key, value): """Changes anything not dundered or not a descriptor. If an enum member name is used twice, an error is raised; duplicate values are not checked for. Single underscore (sunder) names are reserved. """ if _is_sunder(key): if key not in { '_order_', '_create_pseudo_member_', '_generate_next_value_', '_missing_', '_ignore_', }: raise ValueError('_names_ are reserved for future Enum use') if key == '_generate_next_value_': setattr(self, '_generate_next_value', value) elif key == '_ignore_': if isinstance(value, str): value = value.replace(',', ' ').split() else: value = list(value) self._ignore = value already = set(value) & self.members.keys() if already: raise ValueError( '_ignore_ cannot specify already set names: %r' % (already, )) elif _is_dunder(key): if key == '__order__': key = '_order_' elif key in self.members: # descriptor overwriting an enum? raise TypeError('Attempted to reuse key: %r' % key) elif key in self._ignore: pass elif not _is_descriptor(value): if key in self: # enum overwriting a descriptor? raise TypeError('%r already defined as: %r' % (key, self[key])) if isinstance(value, auto): if value.value == _auto_null: value.value = self._generate_next_value( key, 1, len(self.members), list(self.members.values())) value = value.value self.members[key] = value dict.__setitem__(self, key, value)
def __new__(mcs, name: str, bases: Tuple[type, ...], attrs: Dict[str, Any]) -> "Enum": value_mapping: Dict[Any, EnumMember] = {} member_mapping: Dict[str, EnumMember] = {} member_names: List[str] = [] try: value_cls = IntEnumMember if IntEnum in bases else EnumMember except NameError: value_cls = EnumMember for key, value in tuple(attrs.items()): is_descriptor = _is_descriptor(value) if key[0] == "_" and not is_descriptor: continue # special case for classmethods to pass through if isinstance(value, classmethod): continue if is_descriptor: setattr(value_cls, key, value) del attrs[key] continue try: new_value = value_mapping[value] except KeyError: new_value = value_cls(name=key, value=value) value_mapping[value] = new_value member_names.append(key) member_mapping[key] = new_value attrs[key] = new_value attrs["_value_map_"] = value_mapping attrs["_member_map_"] = member_mapping attrs["_member_names_"] = member_names enum_class: "Enum" = super().__new__(mcs, name, bases, attrs) for member in value_mapping.values( ): # edit each value to ensure it's correct member._enum_cls_ = enum_class return enum_class
def update_event(self, inp=-1): self.set_output_val(0, enum._is_descriptor(self.input(0)))