parse_args()和parse_known_args()的用法和区别

  • Post author:
  • Post category:其他


在使用python命令行解析包

argparse

的时候,遇到了

parse_args()



parse_known_args()

两种用法,遂查资料搞清楚两个函数的差别并记录。



1

parse_args()

直接举例子说明。

  1. 新建

    test.py

    文件,代码如下:

    import argparse
    parse = argparse.ArgumentParser()
    parse.add_argument('--flag_int', type=int, default=2, help='flag_int')
    opt1 = parse.parse_args()
    print(opt1)
    
    #  opt2 = parse.parse_known_args()
    #  print(opt2)
    #  print(opt2[0])
    #  print(opt2[1])
    
  2. 在终端输入下面的命令并执行:

    python test.py --flag_int 3
    

    输出结果:

    Namespace(flag_int=3)
    

    可以看出

    parse_args()

    函数返回的是一个命名空间(

    NameSpace

    ),这个

    NameSpace

    中有一些变量,就是我们

    add_argument()

    的那些参数。

  3. 如果在终端输入下面的命令并执行:

    python test.py --flag_int 3 --flag_float 0.3
    

    可以看到命令比

    add_argument()

    的多了一个参数,当然会报错:

    usage: test.py [-h] [--flag_int FLAG_INT]
    test.py: error: unrecognized arguments: --flag_float 0.3
    



    parse_known_args()

    则解决了这个问题。



2 parse_known_args()

同样直接用简单的例子说明问题。

  1. 将test.py的代码改为:

    import argparse
    parse = argparse.ArgumentParser()
    parse.add_argument('--flag_int', type=int, default=2, help='flag_int')
    #  opt1 = parse.parse_args()
    #  print(opt1)
    
    opt2 = parse.parse_known_args()
    print(opt2)
    print(opt2[0])
    print(opt2[1])
    
  2. 在终端输入下面的命令并执行:

    python test.py --flag_int 3
    

    输出结果:

    (Namespace(flag_int=3), [])
    Namespace(flag_int=3)
    []
    

    可以看出

    parse_known_args()

    返回的是一个有两个元素的元组,第一个元素是

    NameSpace

    ,和

    parge_args()

    返回的

    NameSpace

    完全相同,第二个是一个空列表,列表的作用下面可以看出。

  3. 如果在终端输入下面的命令并执行:

    python test.py --flag_int 3 --flag_float 0.3
    

    可以看到命令比

    add_argument()

    的多了一个参数,但是并没有报错,输出结果如下:

    (Namespace(flag_int=3), ['--flag_float', '0.3'])
    Namespace(flag_int=3)
    ['--flag_float', '0.3']
    

可以看出,相对于上一条命令多余的东西,以空格为分节符,以字符串的形式存放在列表中。



版权声明:本文为qyhaill原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。