【python】 config文件读取相关操作

解析命令行参数

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 中的一种解包语法,用于将两个字典合并成一个新字典。它背后的原理是利用字典的解包运算符 **,来展开字典的键值对并合并到一个新的字典中。具体步骤如下:

  1. self.default_cfg:这是 Trainer 类中的默认配置字典,包含一些预设的配置参数。
  2. 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_typebatch_size)则保留原样。

赞赏