我知道这是一个老问题,但我刚刚遇到了同样的问题。我意识到我所需要的只是一种迭代 Action 对象的方法。不幸的是,ArgParser 本身并没有公开内部列表。但是,这些对象是由 返回的add_argument()
,所以我可以构建自己的列表。好吧,在actions.append()
我看来,每次调用都输入太多,所以我将所有选项存储在一个元组中:
def add_argument(*args, **kwargs):
return (args, kwargs)
parser = argparse.ArgumentParser()
options = (
add_argument('--verbose', action='store_true'),
add_argument('--author'),
add_argument('--subject', required=True),
add_argument('--cache', nargs='?'),
add_argument('files', nargs=''),
)
actions = []
for (args, kwargs) in options:
actions.append(parser.add_argument(*args, **kwargs))
args = parser.parse_args()
至此,选项被解析到 中args
,所有argparse.Action
对象都存储在actions
列表中。然后我可以遍历这个列表并重建这样的选项:
cmdline = []
for action in actions:
value = getattr(args, action.dest)
if action.required or value != action.default:
if action.option_strings:
cmdline.append(action.option_strings[0])
if action.nargs is None:
cmdline.append(value)
elif action.nargs == '?':
if value != action.const:
cmdline.append(value)
elif action.nargs != 0:
cmdline += value
在我的具体情况下,我还想从命令行中删除一些选项。为此,我只是通过调用parser.add_argument()
而不是通过options
元组单独添加它们。