如何在没有命令行参数的情况下检查并引发错误

29

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

任何帮助表示赞赏。

hpaulj
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 messagewarning错误通常会终止程序。将显示一条警告消息,然后继续。


这是何时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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在没有命令行参数的情况下提供带有代码内部参数的 python argparse.parser?

在没有命令行的情况下使 Node.js ftp-srv 只读

如何在没有cURL命令行的情况下安装Composer?

如何在命令行上没有Gradle的情况下构建Android APK?

python argparse-在没有命令行的情况下将列表传递到argparse

在Elm 0.18中如何在没有elm-test的情况下执行命令行断言?

如何在没有X会话的情况下通过命令行编辑KDE暂停设置?

在没有Node.js的情况下,如何在命令行上使用npm工具?

如何在没有 sed 的情况下从命令行替换(PHP)文件中的电子邮件?

如何在没有用户干预的情况下从命令行静默卸载软件?

如何在没有命令的情况下创建服务?

如何在没有命令的情况下使用discord.py发送消息

Docker Run:如何在没有命令的情况下运行Ubuntu:16.04?

在没有命令行cURL的情况下在solr中计数不相同

检查是否没有命令行参数且STDIN为空

使用Firebase身份验证服务时,如何在没有现有帐户的情况下通过Facebook / Google登录时引发错误

带有命令行参数的R optparse错误

在没有脚本文件的情况下将命令行参数传递给python解释器

如何在 docker 19.03 中没有命令“--gpus all”的情况下将所有 GPU 暴露给 Kubernetes?

如何在没有DROP数据库权限的情况下从命令行删除所有MySQL表?

Unity 命令行——如何在没有 -quit(ing) 的情况下为每个命令访问现有实例

如何在没有命令提示符的情况下保持 python discord bot 在线运行?

在 Google-Earth-Engine 中没有 if 语句的情况下,如何在参数检查期间抛出错误?

如何在不暂停服务器的情况下使用Gradle命令行参数调试SpringBoot?

如何在具有命令行参数的Haskell程序中读取stdin?

如何在Bash脚本中使用GDB运行带有命令行参数的程序?

如何仅在Windows命令行中没有路径的情况下获取文件名?

如何在不使用命令行的情况下运行Laravel artisan命令

如何在不使用 git 命令的情况下通过命令行从 azure 克隆 repo