11# enum.py
2- # version="1.2.5 "
2+ # version="1.2.6 "
33
44
55class EnumValue :
@@ -14,20 +14,121 @@ def __repr__(self):
1414 def __call__ (self ):
1515 return self .value
1616
17- def __eq__ (self , o ):
18- return self .value == (o .value if isinstance (o , EnumValue ) else o )
19-
2017 def __setattr__ (self , k , v ):
2118 raise AttributeError ("EnumValue is immutable" )
2219
20+ # Helper function to extract the raw value
21+ def _get_value (self , o ):
22+ return o .value if isinstance (o , EnumValue ) else o
23+
24+ # Arithmetic and Bitwise operations (Forward)
25+ def __add__ (self , o ):
26+ return self .value + self ._get_value (o )
27+
28+ def __sub__ (self , o ):
29+ return self .value - self ._get_value (o )
30+
31+ def __mul__ (self , o ):
32+ return self .value * self ._get_value (o )
33+
34+ def __truediv__ (self , o ):
35+ return self .value / self ._get_value (o )
36+
37+ def __floordiv__ (self , o ):
38+ return self .value // self ._get_value (o )
39+
40+ def __mod__ (self , o ):
41+ return self .value % self ._get_value (o )
42+
43+ def __pow__ (self , o ):
44+ return self .value ** self ._get_value (o )
45+
46+ def __and__ (self , o ):
47+ return self .value & self ._get_value (o )
48+
49+ def __or__ (self , o ):
50+ return self .value | self ._get_value (o )
51+
52+ def __xor__ (self , o ):
53+ return self .value ^ self ._get_value (o )
54+
55+ def __lshift__ (self , o ):
56+ return self .value << self ._get_value (o )
57+
58+ def __rshift__ (self , o ):
59+ return self .value >> self ._get_value (o )
60+
61+ # Arithmetic and Bitwise operations (Reflected)
62+ def __radd__ (self , o ):
63+ return self ._get_value (o ) + self .value
64+
65+ def __rsub__ (self , o ):
66+ return self ._get_value (o ) - self .value
67+
68+ def __rmul__ (self , o ):
69+ return self ._get_value (o ) * self .value
70+
71+ def __rtruediv__ (self , o ):
72+ return self ._get_value (o ) / self .value
73+
74+ def __rfloordiv__ (self , o ):
75+ return self ._get_value (o ) // self .value
76+
77+ def __rand__ (self , o ):
78+ return self ._get_value (o ) & self .value
79+
80+ def __ror__ (self , o ):
81+ return self ._get_value (o ) | self .value
82+
83+ def __rxor__ (self , o ):
84+ return self ._get_value (o ) ^ self .value
85+
86+ def __rlshift__ (self , o ):
87+ return self ._get_value (o ) << self .value
88+
89+ def __rrshift__ (self , o ):
90+ return self ._get_value (o ) >> self .value
91+
92+ # Unary operators
93+ def __neg__ (self ):
94+ return - self .value
95+
96+ def __pos__ (self ):
97+ return + self .value
98+
99+ def __abs__ (self ):
100+ return abs (self .value )
101+
102+ def __invert__ (self ):
103+ return ~ self .value
104+
105+ # Comparison
106+ def __eq__ (self , o ):
107+ return self .value == self ._get_value (o )
108+
109+ def __lt__ (self , o ):
110+ return self .value < self ._get_value (o )
111+
112+ def __le__ (self , o ):
113+ return self .value <= self ._get_value (o )
114+
115+ def __gt__ (self , o ):
116+ return self .value > self ._get_value (o )
117+
118+ def __ge__ (self , o ):
119+ return self .value >= self ._get_value (o )
120+
121+ def __ne__ (self , o ):
122+ return self .value != self ._get_value (o )
123+
23124
24125class Enum :
25126 def __new__ (cls , name = None , names = None ):
26127 # If a name and names are provided, create a NEW subclass of Enum
27128 if name and names :
28129 # Support Functional API: Enum("Name", {"KEY": VALUE})
29130 # Dynamically create: class <name>
30- new_cls = type (name , (cls , ), {})
131+ new_cls = type (name , (cls ,), {})
31132 for k , v in names .items ():
32133 new_cls ._up (k , v )
33134 new_cls ._inited = True
0 commit comments