@@ -475,3 +475,47 @@ def load(spec: str) -> Any:
475475 for item in name .split ('.' ):
476476 result = getattr (result , item )
477477 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