@@ -238,7 +238,11 @@ def prepare_arguments(cls, parser: ArgumentParser) -> None:
238
238
239
239
if params .get ("nargs" ) == "*..." :
240
240
cls ._unknown_arguments_dest = aliases [0 ]
241
- params ["nargs" ] = "*"
241
+
242
+ # A bug in standard library argparse before python 3.12.7 causes `...` to not work as expected
243
+ # when used in conjunction with positional and optional arguments.
244
+ # See: https://github.com/python/cpython/issues/59317
245
+ params ["nargs" ] = "*" if sys .version_info < (3 , 12 , 7 ) else "..."
242
246
243
247
if "action" in params :
244
248
params ["action" ] = ACTIONS_MAPPING .get (params ["action" ], params ["action" ])
@@ -281,7 +285,11 @@ def parse_arguments(cls, argv: Sequence[str]) -> Namespace:
281
285
arguments = parser .parse_args (argv )
282
286
else :
283
287
arguments , unknown = parser .parse_known_args (argv )
284
- setattr (arguments , cls ._unknown_arguments_dest , unknown )
288
+ setattr (
289
+ arguments ,
290
+ cls ._unknown_arguments_dest ,
291
+ getattr (arguments , cls ._unknown_arguments_dest , []) + unknown ,
292
+ )
285
293
except SystemExit as exception :
286
294
error_message = stderr .getvalue ()
287
295
error = re .search (rf"{ cls ._name } : error: (.*)$" , error_message , re .MULTILINE )
0 commit comments