Python 如何指示至少需要一个参数?

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文

我的脚本正在接受使用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文件)


表示帮助是可选的,但至少需要其中一个参数。

您可以使用
添加互斥组()


然而,主要的影响是你不能一次使用多个选项。

正如@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感兴趣,同时我想编辑“帮助”中显示的用法消息,但这似乎不可能,所以我要编写一条自定义消息指示要使用的用户--help
old\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