如何表明至少需要一个参数?

时间:2015-07-02 11:19:09

标签: python argparse

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

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

3 个答案:

答案 0 :(得分:2)

关于自定义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函数内部,解析器维护一个已经看到的参数列表(实际设置)。它用于测试所需的参数和mutual_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表示没有找到; >0至少有一位礼物; ==len(ll)全部找到; >1违反了相互排他性; '== 1'表示必要的互斥。

答案 1 :(得分:1)

正如@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')

答案 2 :(得分:0)

您可以使用add_mutually_exclusive_group()

parser = argparse.ArgumentParser ()
group  = parser.add_mutually_exclusive_group (required = True)
group.add_argument ('--foo')
group.add_argument ('--bar')

但是,主要效果是您无法一次使用多个选项。