我有一个argparsing程序:
导入argparse
def main():
p = argparse.ArgumentParser()
help_str = {'rule': 'Blah blah blah and stuff.'}
p.add_argument('-r', '--rule', action="store", type=str, dest='rule', help=help_str['rule'])
p.set_defaults(rule='string')
args = p.parse_args()
因此,我的命令行输入:
username@compname:~$python progname.py -r/--rule 'something'
我试图弄清楚如何输入:
username@compname:~$python progname.py -r/--rule
并出现我自己的错误消息:
print '\n Error: no input value for rule:'
print ' resetting rule to default value.'
args.rule = 'string'
之后,规则值应打印为“字符串”
对不起,我只精通Python。我尝试使用try / except块,甚至使用sys.argv [2](尽管我可能做错了。)这是我的所有解决方案不断弹出的错误(对类型和值以外的错误不是很熟悉) :
progname.py: error: argument -r/--rule: expected one argument
任何帮助表示赞赏。
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)
。并Namespace(rule='something')
与-r 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
。
可以使用customtype
或来添加自定义错误检查action
,但是我认为None
使用后的测试argparse
更简单,更容易理解。
我建议将其更改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)
# cannot access namespace or continue parsing
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')
# create a namespace with this default value
print args
请记住,这样做nargs
有两个目的:-如果给出了错误数量的参数字符串,则会引发错误-在多个Action(由创建的东西add_argument
)之间分配多个参数字符串。
例如,如果您有几个位置,分别采用1,2和*参数,则第二个特别明显。这是argparse的一项重要的新颖功能,至少相对于早期的Python解析器而言。尽管可以对其进行调整,但是很难完全重新定义它。
如果参数允许,则可以使用nargs='*'
“?”代替,并在字符串数不为'2'(或其他任何数字)时发出警告。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句