2015-07-02 46 views
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)

表明帮助是可选的,但这些参数的至少一个是必需的。

+0

对于Python错误/问题补丁我想知道什么是这种'需要任何'条件的良好用法消息。 '|'已经用于互斥'xor'条件。像这样的条件测试更容易设计一个好的API。 – hpaulj

回答

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函数内部维护一个已经看到的参数列表(实际设置)。这用于测试所需的参数,以及用于互斥性的参数,但在代码之外不可用。

对于store_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意味着没有找到;至少有一个礼物; ==len(ll)全部找到; >1违反互相排斥; '== 1'表示需要互斥。

0

您可以使用add_mutually_exclusive_group()

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

然而,主要的影响是,你将无法同时使用多个选项。

+0

我对if-else有同样的效果。我忘了提及我对允许完整或最后一次检查感兴趣,并且同时检查 – yzT

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') 
+0

我想编辑显示在帮助上的用法信息,但似乎不可能,所以我要写一个指示用户的自定义信息使用 - - help – yzT

+0

'old_usage = parser.format_usage()'给出格式化的使用行。你可以编辑它,并用'parser.usage = new_usage'指定它。 – hpaulj

+1

@hpaulj我昨天也找到了。在创建ArgumentParser对象时,一个可选参数是'usage',这正是我所需要的。来这里发布这个答案并且看到你的评论,所以如果你愿意,回答这个问题,我选择它。 – yzT

相关问题