p = argparse.ArgumentParser()
p.add_argument('-r', '--rule', nargs='?', default='string')
args = p.parse_args()
print args
nargs='?'
表示如果没有参数调用,则会生成Namespace(rule='string')
。使用-r
,则args
是Namespace(rule=None)
。而-r something
则生成Namespace(rule='something')
。
现在让我们添加几行代码。
if args.rule is None:
print '\n Error: no input value for rule:'
print ' resetting rule to default value.'
args.rule = 'string'
print args
现在使用'-r'(或
--rule
)的输出为:
Namespace(rule=None)
Error: no input value for rule:
resetting rule to default value.
Namespace(rule='string')
其他情况相同。
如果我删除
default
;
p.add_argument('-r','--rule',nargs ='?')
,则无参数情况也会产生此自定义“错误消息”,因为默认值(在argparse中)为
None
。
可以使用自定义
type
或
action
添加自定义错误检查,但我认为在使用
argparse
后测试
None
更简单,更容易理解。
我建议将此
error message
更改为
warning
。 错误通常终止程序;警告打印消息并继续。
这里提供一个解决方案,当
nargs=2
(或其他固定值)时。这不是一个简单的更改,因为它涉及重新定义
error
方法(在
argparse
文档的末尾有记录),然后捕获它产生的错误。
error
方法无法访问名称空间(args),也无法继续执行
parse_args
。因此,如果
rule
参数存在问题,它将无法处理任何其他参数。
class MyParser(argparse.ArgumentParser):
def error(self, message):
if 'rule' in message:
message = 'wrong number of input values for rule'
raise argparse.ArgumentError(None,message)
else:
super(MyParser, self).error(message)
p = MyParser()
p.add_argument('-r', '--rule', nargs=2)
try:
args = p.parse_args()
except argparse.ArgumentError as e:
print e
args = argparse.Namespace(rule='default')
print args
请记住,
nargs
有两个目的:
- 如果给出了错误数量的参数字符串,则引发错误
- 将多个参数字符串分配给多个操作(由
add_argument
创建的东西)。
如果您有多个位置参数,分别取 1、2 和 * 参数,那么第二个目的尤为明显。这是 argparse 的一个关键新功能,至少相对于早期的 Python 解析器而言。虽然可以进行调整,但很难完全重新定义它。
如果参数允许,您可以使用
nargs='*'
而不是 '?',如果字符串的数量不是 '2'(或其他任何数量),则发出警告。