如何表示至少需要一个参数?
How to indicate that at least one parameter is needed?
我的脚本使用 ArgParse 接受 --full
、--last
和 --check
。如果没有提供选项,它只显示帮助信息。但在那条消息中,参数显示为可选。
usage: script.py [-h] [--full] [--last] [--check log_file]
如果我使用关键字 required
,那么脚本将始终需要参数,这是不正确的。
usage: script.py [-h] --full --last --check log_file
那么,我怎样才能显示类似的内容:
usage: script.py [-h] (--full |--last |--check log_file)
表示帮助是可选的,但至少需要其中一个参数。
您可以使用 add_mutually_exclusive_group()
:
parser = argparse.ArgumentParser ()
group = parser.add_mutually_exclusive_group (required = True)
group.add_argument ('--foo')
group.add_argument ('--bar')
但是,主要影响是您一次不能使用多个选项。
正如@doublep 在他的回答中所解释的那样,如果您想一次使用多个选项:
手动将 usage 消息更改为您想要的消息。
从 Python argparse: Make at least one argument required 添加以下代码:
if not (args.full or args.last or args.check):
parse.error('[-] Error: DISPLAY_ERROR_MESSAGE')
关于自定义usage
的问题:
解析器构造函数采用 usage
参数。立竿见影的效果是设置一个属性:
parser = argparse.ArgumentParser( ... usage=custom_usage...)
print(parser.usage)
# should show None or the custom_usage string
作为普通的 Python 对象属性,您可以在创建解析器后更改它。
usage_str = parser.format_usage()
format_usage
方法要求解析器创建将显示在帮助(和错误消息)中的用法。如果 parser.usage
值为 None
,它根据参数对其进行格式化。如果是字符串,则按原样使用(我认为它会填充 %(prog)s
之类的值)。
因此您可以从头开始编写用法字符串。或者您可以设置解析器,获取当前用法字符串,然后根据您的需要对其进行编辑。在 IDE 中测试解析器时,您很可能会在开发期间进行编辑。但它可以即时完成。
一个粗略的例子:
In [441]: parser=argparse.ArgumentParser()
In [442]: g=parser.add_mutually_exclusive_group()
In [443]: g.add_argument('--foo')
In [444]: g.add_argument('--bar')
In [445]: ustr = parser.format_usage()
# 'usage: ipython3 [-h] [--foo FOO | --bar BAR]\n'
In [450]: parser.usage = ustr.replace('[','(').replace(']',')')
In [451]: parser.format_usage()
# 'usage: usage: ipython3 (-h) (--foo FOO | --bar BAR)\n'
我已将 []
替换为 ()
(甚至在 -h
:( ) 上。
目前测试args
属性的逻辑组合是最好的选择。在 parse_args
函数中,解析器维护它所看到的参数列表(实际上是一组)。这用于测试所需的参数和 mutually_exclusive_arguments,但它在该代码之外不可用。
对于store_true
(或假)参数,只需检查它们的真值。对于其他人,我喜欢测试默认 None
。如果您使用其他 default
值,请相应地进行测试。 None
的一个好处是用户不能给你那个值。
也许最通用的测试参数的方法是计算不属于 None
:
的属性的数量
In [461]: args=argparse.Namespace(one=None, tow=2, three=None)
In [462]: ll = ['one','tow','three']
In [463]: sum([getattr(args,l,None) is not None for l in ll])
Out[463]: 1
0
表示找到none; >0
至少一份礼物; ==len(ll)
全部找到; >1
违反互斥; '==1' 要求互斥。
我的脚本使用 ArgParse 接受 --full
、--last
和 --check
。如果没有提供选项,它只显示帮助信息。但在那条消息中,参数显示为可选。
usage: script.py [-h] [--full] [--last] [--check log_file]
如果我使用关键字 required
,那么脚本将始终需要参数,这是不正确的。
usage: script.py [-h] --full --last --check log_file
那么,我怎样才能显示类似的内容:
usage: script.py [-h] (--full |--last |--check log_file)
表示帮助是可选的,但至少需要其中一个参数。
您可以使用 add_mutually_exclusive_group()
:
parser = argparse.ArgumentParser ()
group = parser.add_mutually_exclusive_group (required = True)
group.add_argument ('--foo')
group.add_argument ('--bar')
但是,主要影响是您一次不能使用多个选项。
正如@doublep 在他的回答中所解释的那样,如果您想一次使用多个选项:
手动将 usage 消息更改为您想要的消息。
从 Python argparse: Make at least one argument required 添加以下代码:
if not (args.full or args.last or args.check):
parse.error('[-] Error: DISPLAY_ERROR_MESSAGE')
关于自定义usage
的问题:
解析器构造函数采用 usage
参数。立竿见影的效果是设置一个属性:
parser = argparse.ArgumentParser( ... usage=custom_usage...)
print(parser.usage)
# should show None or the custom_usage string
作为普通的 Python 对象属性,您可以在创建解析器后更改它。
usage_str = parser.format_usage()
format_usage
方法要求解析器创建将显示在帮助(和错误消息)中的用法。如果 parser.usage
值为 None
,它根据参数对其进行格式化。如果是字符串,则按原样使用(我认为它会填充 %(prog)s
之类的值)。
因此您可以从头开始编写用法字符串。或者您可以设置解析器,获取当前用法字符串,然后根据您的需要对其进行编辑。在 IDE 中测试解析器时,您很可能会在开发期间进行编辑。但它可以即时完成。
一个粗略的例子:
In [441]: parser=argparse.ArgumentParser()
In [442]: g=parser.add_mutually_exclusive_group()
In [443]: g.add_argument('--foo')
In [444]: g.add_argument('--bar')
In [445]: ustr = parser.format_usage()
# 'usage: ipython3 [-h] [--foo FOO | --bar BAR]\n'
In [450]: parser.usage = ustr.replace('[','(').replace(']',')')
In [451]: parser.format_usage()
# 'usage: usage: ipython3 (-h) (--foo FOO | --bar BAR)\n'
我已将 []
替换为 ()
(甚至在 -h
:( ) 上。
目前测试args
属性的逻辑组合是最好的选择。在 parse_args
函数中,解析器维护它所看到的参数列表(实际上是一组)。这用于测试所需的参数和 mutually_exclusive_arguments,但它在该代码之外不可用。
对于store_true
(或假)参数,只需检查它们的真值。对于其他人,我喜欢测试默认 None
。如果您使用其他 default
值,请相应地进行测试。 None
的一个好处是用户不能给你那个值。
也许最通用的测试参数的方法是计算不属于 None
:
In [461]: args=argparse.Namespace(one=None, tow=2, three=None)
In [462]: ll = ['one','tow','three']
In [463]: sum([getattr(args,l,None) is not None for l in ll])
Out[463]: 1
0
表示找到none; >0
至少一份礼物; ==len(ll)
全部找到; >1
违反互斥; '==1' 要求互斥。