23
23
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24
24
DEALINGS IN THE SOFTWARE.
25
25
"""
26
+ from __future__ import annotations
26
27
27
28
import types
28
29
from typing import Union , Any , Type
79
80
)
80
81
81
82
82
- def _create_value_cls (name ):
83
+ def _create_value_cls (name ) -> Type [ tuple ] :
83
84
cls = namedtuple (f'_EnumValue_' + name , 'name value' )
84
85
cls .__repr__ = lambda self : '<%s.%s: %r>' % (name , self .name , self .value )
85
86
cls .__str__ = lambda self : '%s.%s' % (name , self .name )
86
87
87
88
def __getattribute__ (self , n ) -> Union [bool , Any ]:
89
+ # With this you can use something like some_channel.type.text to check if it is of this type
90
+ # It is similar to "some_channel.type == ChannelType.text"
88
91
if n in dir (cls ):
89
92
return super (cls , self ).__getattribute__ (n )
90
93
else :
91
94
if n in self ._actual_enum_cls_ .__members__ :
92
95
return self .name == n
93
96
else :
94
97
raise AttributeError (f'{ self .__class__ .__name__ } has no attribute { n } .' )
95
-
96
- # With this you can use something like some_channel.type.text to check if it is of this type
97
- # It is similar to "some_channel.type == ChannelType.text"
98
+
98
99
cls .__getattribute__ = __getattribute__
99
100
return cls
100
101
@@ -104,7 +105,7 @@ def _is_descriptor(obj):
104
105
105
106
106
107
class EnumMeta (type ):
107
- def __new__ (cls , name , bases , attrs ):
108
+ def __new__ (mcs , name , bases , attrs ):
108
109
value_mapping = {}
109
110
member_mapping = {}
110
111
member_names = []
@@ -127,45 +128,44 @@ def __new__(cls, name, bases, attrs):
127
128
try :
128
129
new_value = value_mapping [value ]
129
130
except KeyError :
130
- new_value = value_cls (name = key , value = value )
131
+ new_value = value_cls (name = key , value = value ) # type: ignore
131
132
value_mapping [value ] = new_value
132
133
member_names .append (key )
133
134
134
135
member_mapping [key ] = new_value
135
136
attrs [key ] = new_value
136
137
137
-
138
138
attrs ['_enum_value_map_' ] = value_mapping
139
139
attrs ['_enum_member_map_' ] = member_mapping
140
140
attrs ['_enum_member_names_' ] = member_names
141
- actual_cls = super ().__new__ (cls , name , bases , attrs )
141
+ actual_cls = super ().__new__ (mcs , name , bases , attrs )
142
142
value_cls ._actual_enum_cls_ = actual_cls
143
143
return actual_cls
144
144
145
145
def __iter__ (cls ):
146
- return (cls ._enum_member_map_ [name ] for name in cls ._enum_member_names_ )
146
+ return (cls ._enum_member_map_ [name ] for name in cls ._enum_member_names_ ) # type: ignore
147
147
148
148
def __reversed__ (cls ):
149
- return (cls ._enum_member_map_ [name ] for name in reversed (cls ._enum_member_names_ ))
149
+ return (cls ._enum_member_map_ [name ] for name in reversed (cls ._enum_member_names_ )) # type: ignore
150
150
151
151
def __len__ (cls ):
152
- return len (cls ._enum_member_names_ )
152
+ return len (cls ._enum_member_names_ ) # type: ignore
153
153
154
154
def __repr__ (cls ):
155
155
return '<enum %r>' % cls .__name__
156
156
157
157
@property
158
158
def __members__ (cls ):
159
- return types .MappingProxyType (cls ._enum_member_map_ )
159
+ return types .MappingProxyType (cls ._enum_member_map_ ) # type: ignore
160
160
161
161
def __call__ (cls , value ):
162
162
try :
163
- return cls ._enum_value_map_ [value ]
163
+ return cls ._enum_value_map_ [value ] # type: ignore
164
164
except (KeyError , TypeError ):
165
165
raise ValueError ("%r is not a valid %s" % (value , cls .__name__ ))
166
166
167
167
def __getitem__ (cls , key ):
168
- return cls ._enum_member_map_ [key ]
168
+ return cls ._enum_member_map_ [key ] # type: ignore
169
169
170
170
def __setattr__ (cls , name , value ):
171
171
raise TypeError ('Enums are immutable.' )
@@ -177,7 +177,7 @@ def __instancecheck__(self, instance):
177
177
# isinstance(x, Y)
178
178
# -> __instancecheck__(Y, x)
179
179
try :
180
- return instance ._actual_enum_cls_ is self
180
+ return instance ._actual_enum_cls_ is self # type: ignore
181
181
except AttributeError :
182
182
return False
183
183
@@ -186,7 +186,7 @@ class Enum(metaclass=EnumMeta):
186
186
@classmethod
187
187
def try_value (cls , value ):
188
188
try :
189
- return cls ._enum_value_map_ [value ]
189
+ return cls ._enum_value_map_ [value ] # type: ignore
190
190
except (KeyError , TypeError ):
191
191
return value
192
192
0 commit comments