Exemple #1
0
 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))
Exemple #2
0
    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))
Exemple #3
0
    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)
Exemple #4
0
    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
Exemple #5
0
 def update_event(self, inp=-1):
     self.set_output_val(0, enum._is_descriptor(self.input(0)))