解析命令行参数
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
)则保留原样。