解析命令行参数
argparse.ArgumentParser() 是 Python 标准库中的一个模块,用于解析命令行参数。这个模块非常适合为 Python 脚本添加命令行接口,使得用户可以在运行脚本时指定不同的参数和选项。
以下是 argparse.ArgumentParser() 的详细讲解:
1. 创建 ArgumentParser 对象
import argparse
parser = argparse.ArgumentParser(description="这是一个示例脚本")
argparse.ArgumentParser()创建一个参数解析器对象parser。description参数可以用来为这个解析器提供描述,当用户使用-h或--help时会显示这个描述。
2. 添加命令行参数
使用 add_argument() 方法为解析器添加参数。常用的参数类型包括位置参数、可选参数、布尔标志等。
位置参数
位置参数是必须提供的,它们的值由位置决定:
parser.add_argument("filename", type=str, help="输入文件的名称")
"filename"是参数的名称。type指定参数的类型(例如str,int,float)。help提供关于参数的帮助信息。
可选参数
可选参数通常以 - 或 -- 开头,可以省略,如果不提供则使用默认值:
parser.add_argument("--verbosity", type=int, default=0, help="增加输出的详细程度")
"--verbosity"是一个可选参数,它可以省略。default=0指定了默认值为0。- 如果在命令行中使用
--verbosity,可以指定一个整数值。
布尔标志
布尔标志是特殊的可选参数,它不需要值,通常用来打开或关闭某个功能:
parser.add_argument("--verbose", action="store_true", help="启用详细输出")
action="store_true"表示当这个标志存在时,verbose的值为True,否则为False。
3. 解析命令行参数
当所有参数定义好后,使用 parse_args() 方法解析命令行输入:
args = parser.parse_args()
args是一个命名空间对象,包含所有解析出来的参数。- 可以通过
args.<参数名>访问具体的参数值,例如args.filename,args.verbosity。
4. 使用解析的参数
解析后的参数可以直接在代码中使用:
if args.verbose:
print("详细输出模式已启用")
print(f"输入文件为: {args.filename}")
5. 帮助信息
当用户在命令行中使用 -h 或 --help 时,argparse 会自动生成并显示帮助信息,包括描述和每个参数的说明:
$ python script.py -h
usage: script.py [-h] [--verbosity VERBOSITY] [--verbose] filename
这是一个示例脚本
positional arguments:
filename 输入文件的名称
optional arguments:
-h, --help show this help message and exit
--verbosity VERBOSITY
增加输出的详细程度
--verbose 启用详细输出
6. 完整示例
以下是一个简单的完整示例:
import argparse
# 创建解析器
parser = argparse.ArgumentParser(description="这是一个示例脚本")
# 添加参数
parser.add_argument("filename", type=str, help="输入文件的名称")
parser.add_argument("--verbosity", type=int, default=0, help="增加输出的详细程度")
parser.add_argument("--verbose", action="store_true", help="启用详细输出")
# 解析参数
args = parser.parse_args()
# 使用参数
if args.verbose:
print("详细输出模式已启用")
print(f"输入文件为: {args.filename}")
print(f"详细程度: {args.verbosity}")
总结
argparse.ArgumentParser() 是一个强大且易于使用的模块,可以让 Python 脚本接受命令行输入,并自动处理用户输入的参数。它能够自动生成帮助信息,支持多种参数类型,使得脚本更加灵活和用户友好。
读取cfg和default_cfg融合
{**self.default_cfg, **cfg} 是 Python 中的一种解包语法,用于将两个字典合并成一个新字典。它背后的原理是利用字典的解包运算符 **,来展开字典的键值对并合并到一个新的字典中。具体步骤如下:
self.default_cfg:这是 Trainer 类中的默认配置字典,包含一些预设的配置参数。cfg:这是用户传入的配置字典,通常用于覆盖默认配置中的一些参数。
合并逻辑:
**self.default_cfg解包self.default_cfg中的所有键值对,将它们展开放入新的字典中。**cfg解包cfg中的所有键值对,并将它们也展开放入同一个新字典中。- 如果
cfg中的某个键与self.default_cfg中的键相同,那么cfg中的键值对会覆盖self.default_cfg中的对应键值对。
最终效果是:优先使用用户传入的 cfg 配置,如果 cfg 中没有的配置项,则使用 self.default_cfg 中的默认值。
例子:
default_cfg = {
"optimizer_type": 'adam',
"lr": 0.001,
"batch_size": 32,
}
cfg = {
"lr": 0.0005, # 覆盖默认的学习率
}
# 合并两个字典
merged_cfg = {**default_cfg, **cfg}
# 结果:
# {'optimizer_type': 'adam', 'lr': 0.0005, 'batch_size': 32}
在这个例子中,cfg 中的 lr 覆盖了 default_cfg 中的 lr 值,而 default_cfg 中其他没有被 cfg 覆盖的部分(如 optimizer_type 和 batch_size)则保留原样。