一、引言

        Python argparse是Python内置的、用于命令项选项与参数解析的模块,该模块可以让人轻松编写用户友好的命令行接口,能够帮助程序员为模型定义参数。

        应用场景举例。例如,你写了一份Python代码,该代码有一些参数在我的程序中无法确定,而是要等到你去调用Python文件执行时才可以确定。这时,你就可以通过argparse来大展身手。

        使用举例。当你为你的Python程序定义好一些参数列表之后,你可以调用下面的脚本/命令来执行你的Python程序:

python a_code.py --name "JACK Williams" --height 175.6 --weight 75

        其中“a_code.py”是你写的Python程序,“name”、“height”和“weight”是你的程序所需要用到的参数,且这些参数的值需要在执行时才能确定。

        由于我们经常会用到argparse这个Python自带库,所以在程序中如果出现很多参数时,我们难免会想要通过保存成文件的方式来存住这些参数,这样,如果程序下次还需要调用这些参数,我们就可以快速地、自动地、高效地得到这些曾经输入过的参数值。

        所以,这篇博客提供了argparse对象和dict对象相互转换的方法。如果你想要保存这些参数和参数值到文件,就可以先将argparse转为dict对象(这也可以认为是简版json对象,因为dict只有键值对),然后再将dict对象通过Python自带的json库来将其保存到文件中去。对于json对象的文件读写,可以参考Python json对象 - 文件 读写这篇博客。

argparse到dict(json)再到文件,也可以从文件到dict(json)再到argparse。

二、argparse转dict

        思路:在Python程序中定义好参数列表,然后从终端读取参数列表得到argparse对象,然后将该对象转化为dict对象。

        1、代码:在Python程序中定义好参数列表(也包括了argparse到dict的转换),这里对应的Python程序文件名为“args2dict.py”

import argparse

# define arguments
def parse_args(args=None):
    parser = argparse.ArgumentParser()
    parser.add_argument('--Name', type=str)
    parser.add_argument('--ID', type=int)
    parser.add_argument('--At_School', type=bool)
    parser.add_argument('--Math_Score', type=float)
    return parser.parse_args(args)

# program entrance
if __name__ == '__main__':
    # read args from the terminal
    an_args = parse_args()

    # transfer the args to a dict
    args_dict = vars(an_args)

    # use the dict
    for k in args_dict.keys():
        print(k, args_dict[k], type(args_dict[k]))

        2、在终端中执行“args2dict.py”时输入参数列表,完了以后程序会自动将参数列表转成dict对象

python args2dict.py --Name "JACK Williams" --ID 391568 --At_School true --Math_Score 95.6

        3、程序的执行输出如下

Name JACK Williams <class 'str'>
ID 391568 <class 'int'>
At_School True <class 'bool'>
Math_Score 95.6 <class 'float'>

三、dict转argparse

        思路:调用argparse的静态方法Namespace,自动将dict的键值对转化为argparse对象

        代码

import argparse

# create a dict object
a_student = {'Name': 'JACK Williams',
             'ID': 391568,
             'At_School': True,
             'Math_Score': 92.3}

# transfer the dict object to an ArgumentParser object
args = argparse.Namespace(**a_student)

# use the ArgumentParser object
print(args.Name, type(args.Name))
print(args.ID, type(args.ID))
print(args.At_School, type(args.At_School))
print(args.Math_Score, type(args.Math_Score))

        该程序输出如下

JACK Williams <class 'str'>
391568 <class 'int'>
True <class 'bool'>
92.3 <class 'float'>

四、参考

        1、以字典形式传入argparse的参数

        2、Python使用json库进行json对象的文件读写操作