@@ -475,3 +475,47 @@ def load(spec: str) -> Any:
475
475
for item in name .split ('.' ):
476
476
result = getattr (result , item )
477
477
return result
478
+
479
+ # Next two functions are copied from stdlib enum module, as they were removed in Python 3.11
480
+
481
+ def _decompose (flag , value ):
482
+ """
483
+ Extract all members from the value.
484
+ """
485
+ # _decompose is only called if the value is not named
486
+ not_covered = value
487
+ negative = value < 0
488
+ # issue29167: wrap accesses to _value2member_map_ in a list to avoid race
489
+ # conditions between iterating over it and having more pseudo-
490
+ # members added to it
491
+ if negative :
492
+ # only check for named flags
493
+ flags_to_check = [
494
+ (m , v )
495
+ for v , m in list (flag ._value2member_map_ .items ())
496
+ if m .name is not None
497
+ ]
498
+ else :
499
+ # check for named flags and powers-of-two flags
500
+ flags_to_check = [
501
+ (m , v )
502
+ for v , m in list (flag ._value2member_map_ .items ())
503
+ if m .name is not None or _power_of_two (v )
504
+ ]
505
+ members = []
506
+ for member , member_value in flags_to_check :
507
+ if member_value and member_value & value == member_value :
508
+ members .append (member )
509
+ not_covered &= ~ member_value
510
+ if not members and value in flag ._value2member_map_ :
511
+ members .append (flag ._value2member_map_ [value ])
512
+ members .sort (key = lambda m : m ._value_ , reverse = True )
513
+ if len (members ) > 1 and members [0 ].value == value :
514
+ # we have the breakdown, don't need the value member itself
515
+ members .pop (0 )
516
+ return members , not_covered
517
+
518
+ def _power_of_two (value ):
519
+ if value < 1 :
520
+ return False
521
+ return value == 2 ** (value .bit_length () - 1 )
0 commit comments