From 42c6e092e94f11bb5de9bae0cdb40830dc865702 Mon Sep 17 00:00:00 2001 From: Yuanyuan Chen Date: Wed, 8 Oct 2025 19:00:30 +0800 Subject: [PATCH 1/2] Simplify handling of Union types in HfArgumentParser Signed-off-by: Yuanyuan Chen --- src/transformers/hf_argparser.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/transformers/hf_argparser.py b/src/transformers/hf_argparser.py index b9e6f99b041d..8917662c92d5 100644 --- a/src/transformers/hf_argparser.py +++ b/src/transformers/hf_argparser.py @@ -176,9 +176,12 @@ def _parse_dataclass_field(parser: ArgumentParser, field: dataclasses.Field): f" Problem encountered in field '{field.name}'." ) if type(None) not in field.type.__args__: - # filter `str` in Union - field.type = field.type.__args__[0] if field.type.__args__[1] is str else field.type.__args__[1] - origin_type = getattr(field.type, "__origin__", field.type) + if len(field.type.__args__) > 2: + origin_type = str + else: + # filter `str` in Union + field.type = field.type.__args__[0] if field.type.__args__[1] is str else field.type.__args__[1] + origin_type = getattr(field.type, "__origin__", field.type) elif bool not in field.type.__args__: # filter `NoneType` in Union (except for `Union[bool, NoneType]`) field.type = ( From bc8efee4de350e1a74e334e8db080ea09c860014 Mon Sep 17 00:00:00 2001 From: cyy Date: Thu, 14 May 2026 07:50:58 +0800 Subject: [PATCH 2/2] Improve Union type handling in HfArgumentParser --- src/transformers/hf_argparser.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/transformers/hf_argparser.py b/src/transformers/hf_argparser.py index 8917662c92d5..b65edd1a5d72 100644 --- a/src/transformers/hf_argparser.py +++ b/src/transformers/hf_argparser.py @@ -176,17 +176,15 @@ def _parse_dataclass_field(parser: ArgumentParser, field: dataclasses.Field): f" Problem encountered in field '{field.name}'." ) if type(None) not in field.type.__args__: - if len(field.type.__args__) > 2: - origin_type = str - else: - # filter `str` in Union - field.type = field.type.__args__[0] if field.type.__args__[1] is str else field.type.__args__[1] - origin_type = getattr(field.type, "__origin__", field.type) + # filter `str` in Union + field.type = field.type.__args__[0] if field.type.__args__[1] is str else field.type.__args__[1] + origin_type = getattr(field.type, "__origin__", field.type) elif bool not in field.type.__args__: # filter `NoneType` in Union (except for `Union[bool, NoneType]`) - field.type = ( - field.type.__args__[0] if isinstance(None, field.type.__args__[1]) else field.type.__args__[1] - ) + if str in field.type.__args__ and len(field.type.__args__) > 2: + field.type = str + else: + field.type = next(arg for arg in field.type.__args__ if arg is not type(None)) origin_type = getattr(field.type, "__origin__", field.type) # A variable to store kwargs for a boolean field, if needed