如何检查没有命令行argumen并引发错误

2024-04-26 21:23:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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()

因此,我的命令行输入:

^{pr2}$

我在想办法输入:

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块甚至系统argv[2] (虽然我可能做错了什么。)这是我所有解决方案中不断出现的错误(对类型和值之外的错误不太熟悉):

progname.py: error: argument -r/--rule: expected one argument

感谢任何帮助。在


Tags: py程序stringvalue错误argparsehelpargs
1条回答
网友
1楼 · 发布于 2024-04-26 21:23:36
p = argparse.ArgumentParser()
p.add_argument('-r', ' rule', nargs='?', default='string')
args = p.parse_args()
print args

withnargs='?'如果没有参数调用,则生成{}。对于-r,args是Namespace(rule=None)。和Namespace(rule='something')和{}。在

让我们添加几行代码

^{pr2}$

现在带有'-r'(或 rule)的输出是:

Namespace(rule=None)

    Error: no input value for rule:
    resetting rule to default value.
Namespace(rule='string')

其他情况相同。在

{{cd8>在默认情况下,{cd10>也会生成

可以使用自定义typeaction添加自定义错误检查,但我认为在使用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有两个目的: -如果给定的参数字符串数目错误,则引发错误 -在多个操作之间分配多个参数字符串(由add_argument创建的东西)。在

第二种情况尤其明显,例如,如果你有几个位置,分别取1、2和*参数。对于Python语法分析器来说,它至少是一个新颖的功能。虽然可以调整它,但很难完全重新定义它。在

如果参数允许,可以使用nargs='*'来代替“?”,并在字符串数不是“2”(或其他值)时发出警告。在

相关问题 更多 >