gpt4 book ai didi

python argparse - 带有选项的可选附加参数

转载 作者:IT老高 更新时间:2023-10-28 21:11:36 28 4
gpt4 key购买 nike

我有一个脚本,我在其中询问用户要执行的预定义操作列表。我还希望能够在用户未定义任何内容时假设特定的操作列表。但是,似乎不可能同时完成这两项工作。

当用户不提供参数时,他们会收到默认选择无效的错误

acts = ['clear','copy','dump','lock']
p = argparse.ArgumentParser()
p.add_argument('action', nargs='*', action='append', choices=acts, default=[['dump', 'clear']])
args = p.parse_args([])
>>> usage: [-h] [{clear,copy,dump,lock} [{clear,copy,dump,lock} ...]]
: error: argument action: invalid choice: [['dump', 'clear']] (choose from 'clear', 'copy', 'dump', 'lock')

当他们确实定义了一组操作时,生成的命名空间会将用户的操作附加到默认值,而不是替换默认值

acts = ['clear','copy','dump','lock']
p = argparse.ArgumentParser()
p.add_argument('action', nargs='*', action='append', choices=acts, default=[['dump', 'clear']])
args = p.parse_args(['lock'])
args
>>> Namespace(action=[['dump', 'clear'], ['dump']])

最佳答案

您可以使用自定义的 argparse.Action 来完成您需要的操作,如下例所示:

import argparse

parser = argparse.ArgumentParser()

class DefaultListAction(argparse.Action):
CHOICES = ['clear','copy','dump','lock']
def __call__(self, parser, namespace, values, option_string=None):
if values:
for value in values:
if value not in self.CHOICES:
message = ("invalid choice: {0!r} (choose from {1})"
.format(value,
', '.join([repr(action)
for action in self.CHOICES])))

raise argparse.ArgumentError(self, message)
setattr(namespace, self.dest, values)

parser.add_argument('actions', nargs='*', action=DefaultListAction,
default = ['dump', 'clear'],
metavar='ACTION')

print parser.parse_args([])
print parser.parse_args(['lock'])

脚本的输出是:

$ python test.py 
Namespace(actions=['dump', 'clear'])
Namespace(actions=['lock'])

关于python argparse - 带有选项的可选附加参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8526675/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com