Python 如何指示至少需要一个参数?
我的脚本正在接受使用ArgParse的Python 如何指示至少需要一个参数?,python,argparse,Python,Argparse,我的脚本正在接受使用ArgParse的--full、--last和--check。如果没有提供选项,它只显示帮助消息。但在该消息中,参数显示为可选 用法:script.py[-h][--full][--last][--check log\u file] 如果我使用关键字required,那么脚本将始终使用不正确的参数 用法:script.py[-h]--完整--最后--检查日志文件 那么,我怎样才能展示这样的东西: 用法:script.py[-h](-full-last-check log\u文
--full
、--last
和--check
。如果没有提供选项,它只显示帮助消息。但在该消息中,参数显示为可选
用法:script.py[-h][--full][--last][--check log\u file]
如果我使用关键字required
,那么脚本将始终使用不正确的参数
用法:script.py[-h]--完整--最后--检查日志文件
那么,我怎样才能展示这样的东西:
用法:script.py[-h](-full-last-check log\u文件)
表示帮助是可选的,但至少需要其中一个参数。您可以使用
添加互斥组()
然而,主要的影响是你不能一次使用多个选项。正如@doublep在他的回答中解释的那样,如果你想一次使用多个选项:
手动将消息更改为所需的消息
从中添加以下代码:
关于自定义用法的问题
:
解析器构造函数接受一个用法
参数。直接效果是设置一个属性:
parser = argparse.ArgumentParser( ... usage=custom_usage...)
print(parser.usage)
# should show None or the custom_usage string
作为一个普通的Python对象属性,您可以在创建解析器后对其进行更改
usage_str = parser.format_usage()
format\u 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
函数中,解析器维护一个它看到的参数列表(实际上是一组)。该列表用于测试必需参数和互斥参数,但在该代码之外不可用
对于store\u true
(或false)参数,只需检查它们的真值即可。对于其他参数,我喜欢测试默认值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
表示未找到;>0
至少存在一个;==len(ll)
all found;>1
违反了互斥性;'==1'表示所需的互斥性。我对if else也有同样的效果。我忘了提到我对允许full或last和check感兴趣,同时我想编辑“帮助”中显示的用法消息,但这似乎不可能,所以我要编写一条自定义消息指示要使用的用户--helpold\u usage=parser.format\u usage()
给出了格式化的用法行。你可以编辑它,然后用parser.usage=new\u usage
@hpaulj将其分配回。我昨天也发现了这一点。在创建ArgumentParser对象的那一刻,一个可选参数是usage
,这正是我所寻找的。我来这里是为了将其作为答案发布,并刚刚看到你的评论,所以如果你愿意,回答这个问题,我选择它。@hpaulj即使是我也会很感激你的回答,因为我不明白你说的话。这对我来说也是一个更好的机会来学习argparse
中的新内容。对于一个Python bug/issues补丁,我想知道这种“r”的好用法是什么需要任何条件。|
已用于互斥的xor
条件。测试此类条件更容易设计好的API。
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'
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