如何检查并引发没有命令行参数的错误
Posted
技术标签:
【中文标题】如何检查并引发没有命令行参数的错误【英文标题】:How to Check for and raise an error for no command line argument 【发布时间】:2013-12-15 03:07:28 【问题描述】:我有一个 argparsing 程序:
导入参数解析
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
任何帮助表示赞赏。
【问题讨论】:
nvrmnd,问题解决了 【参考方案1】: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
。
可以使用自定义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)
# 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
有 2 个用途:
- 如果给出错误数量的参数字符串,则引发错误
- 在多个Action之间分配多个参数字符串(add_argument
创建的东西)。
例如,如果您有多个位置,分别采用 1,2 和 * 参数,则第二个尤其明显。它是 argparse 的一个关键新特性,至少相对于早期的 Python 解析器而言。虽然可以对其进行调整,但很难完全重新定义它。
如果参数允许,您可以使用nargs='*'
代替“?”,如果字符串数不是“2”(或其他),则发出警告。
【讨论】:
谢谢,这让我发疯了。如果您已经有一个带有必要数值的 narg 语句怎么办?有解决办法吗? 我添加了一个重新定义parser.error
方法的部分解决方案。以上是关于如何检查并引发没有命令行参数的错误的主要内容,如果未能解决你的问题,请参考以下文章