def create_options( *, input_file: os.PathLike, output_file: os.PathLike, parser: ArgumentParser, **kwargs, ): cmdline = [] deferred = [] for arg, val in kwargs.items(): if val is None: continue # These arguments with special handling for which we bypass # argparse if arg in {'progress_bar', 'plugins'}: deferred.append((arg, val)) continue cmd_style_arg = arg.replace('_', '-') # Booleans are special: add only if True, omit for False if isinstance(val, bool): if val: cmdline.append(f"--{cmd_style_arg}") continue if isinstance(val, Iterable) and not isinstance(val, str): for elem in val: cmdline.append(f"--{cmd_style_arg}") cmdline.append(elem) continue # We have a parameter cmdline.append(f"--{cmd_style_arg}") if isinstance(val, (int, float)): cmdline.append(str(val)) elif isinstance(val, str): cmdline.append(val) elif isinstance(val, Path): cmdline.append(str(val)) else: raise TypeError(f"{arg}: {val} ({type(val)})") cmdline.append(str(input_file)) cmdline.append(str(output_file)) parser._api_mode = True options = parser.parse_args(cmdline) for keyword, val in deferred: setattr(options, keyword, val) return options