python 参数定义库argparse

这一块的官方文档在这里

注意到这个库是因为argparse在IDE中和在ipython notebook中使用是有差异的,习惯了再IDE里面用,转到ipython中会报错,究其原因,还是对库的本质不够理解。

打开argparse.py,里面有很多class,但是,实际笨妞貌似只用过ArgumentParser。ArgumentParser是用来创建argparse类的。

一般的应用过程是这样的:

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+', 
                    help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))

包含了创建参数类,添加参数,存储和使用参数。

执行如下命令:

python xx.py 1 2 3 4

结果:

4


ArgumentParser可配置的参数很多,如下图,但大多都没必要配置的。



add_argument添加参数,这个方法配置参数来告诉系统命令行如何传输参数进来。可配置的参数如下:

* name or flags - 名称或选项字符串列表, e.g. foo or -f, --foo.
* action - 参数如果定义了选项,表示这是一个操作参数,至于调用时做哪种操作由用户输入或者default决定。
* nargs - 应该使用的命令行参数数。.
* const - 某些动作或参数个数的常数值。.
* default - 如果命令行没有对输入这个参数相应的值,则此参数用default给出的值.
* type -将用户输入的值转化为哪种类型.
* choices - 参数可输入值的范围或选择.
* required - 命令行输入的值是否可以被忽略(布尔量).
* help - 参数的简要描述.
* metavar - useage中显示的参数的名称.
* dest - 要添加到解析参数返回的对象中的属性的名称.

parser_args将解析参数传递到一个空间中,后续可以通过变量访问。

* args - 要解析的字符串序列,默认值取自sys.argv。List of strings to parse. The default is taken from sys.argv.
* namespace -一个接受属性的对象。默认是一个新的空命名空间对象。


通过IDE和ipython使用argparser的差异就在“args = parser.parse_args()”。IDE中parse_args()可以直接使用,只要在命令行执行时,要求必须设置的参数给都值了就没有问题,如果所有参数都有默认值,py文件执行时,不给参数也不会出错。而ipython 在parse_args()这句必须配置args,即便add_argument添加的参数都有默认值也要在配置args,不然执行会报如下错误:

ipykernel_launcher.py: error: unrecognized arguments: -f C:\Users\Administrator\AppData\Roaming\jupyter\runtime\kernel-eeea08d1-8918-441d-9352-59cae31c447e.json
An exception has occurred, use %tb to see the full traceback.

SystemExit: 2

对于含有必须输入值的函数,这个问题是合理的,因为ipython里面读参数不通过命令行,必须通过parse_args传值。

但是,如下程序

import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('--a_para', default=2, type=int, required=False,
                    help='first parameter')
parser.add_argument('--b_para',  default=3,type=int, required=False,
                    help='second parameter')
args = parser.parse_args()
print(args.a_para, args.b_para)

直接在IDE中运行,不通过命令行,不传参数便可以成功.

2 3

但在ipython中必须是这样的

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('--a_para', default=2, type=int, required=False,
                    help='first parameter')
parser.add_argument('--b_para',  default=3,type=int, required=False,
                    help='second parameter')

args = parser.parse_args(['--a_para', '2'])  #至少输入一个参数
print(args.a_para, args.b_para)

输出:

2 3
是不是很无厘头,然而就是这样的。







猜你喜欢

转载自blog.csdn.net/juanjuan1314/article/details/79664467