@@ -537,27 +537,36 @@ def EnumArgument(
537537 Returns:
538538 TypedArgument instance.
539539 """
540+ # Map accepted spellings to members explicitly instead of relying
541+ # on ``str.upper()`` round-trips, which break for enums whose
542+ # member names are not fully uppercase (``Fast`` -> ``FAST`` ->
543+ # KeyError). ``__members__`` includes aliases (e.g. ``WARN`` for
544+ # ``WARNING``) so they keep working as inputs; ``choices`` lists
545+ # canonical names only.
546+ members = enum_class .__members__
540547 if lowercase :
548+ name_map = {n .lower (): m for n , m in members .items ()}
541549 choices = tuple (e .name .lower () for e in enum_class )
542550 else :
551+ name_map = dict (members )
543552 choices = tuple (e .name for e in enum_class )
544553
545554 if default is not None :
546555 if isinstance (default , enum_class ):
547556 pass # Valid enum member
548557 elif isinstance (default , str ):
549558 # Validate string is a valid enum member name
550- check_name = default .upper () if lowercase else default
551- valid_names = tuple (e .name for e in enum_class )
552- if check_name not in valid_names :
559+ member = members .get (default )
560+ if member is None and lowercase :
561+ member = name_map .get (default .lower ())
562+ if member is None :
553563 raise EnumValueError (
554564 f"default { default !r} is not a valid { enum_class .__name__ } "
555565 f"member" ,
556566 enum_class = enum_class ,
557- valid_values = valid_names ,
567+ valid_values = tuple ( e . name for e in enum_class ) ,
558568 )
559- # Convert string default to enum member
560- default = enum_class [check_name ]
569+ default = member
561570 else :
562571 raise EnumValueError (
563572 f"default must be { enum_class .__name__ } member or string, "
@@ -574,9 +583,12 @@ def converter(x: Any) -> Any:
574583 # Handle existing enum members
575584 if isinstance (x , enum_class ):
576585 return x .value if use_value else x
577- # Convert string to enum
578- name = x .upper () if lowercase else x
579- member = enum_class [name ]
586+ # Convert string to enum member via the explicit name map
587+ member = name_map .get (x .lower () if lowercase else x )
588+ if member is None :
589+ # Same failure mode as enum_class[x]; parse_args wraps
590+ # converter errors into TypeConversionError.
591+ raise KeyError (x )
580592 return member .value if use_value else member
581593
582594 return TypedArgument (
0 commit comments