使用字典的方式给python程序添加config信息

本文介绍了如何使用字典来管理Python程序的配置信息,通过创建一个类将字典内容转化为可读性强的对象。在`config.py`中定义配置字典,然后在`__init__.py`中实现字典到类的转换方法,最后在主程序`test.py`中加载并使用配置。这种方法使得参数配置更加灵活和易于操作。

使用字典的方式给python程序添加config信息

1. 介绍

​ 对我来说,需要很多配置信息的python程序,主要是模型训练的脚本,需要设置batch_size等参数,本文记录一个比较好用的参数配置方法,利用了字典,并生成一个类。

2. 最简程序结构

├── configs
│   ├── config.py
│   └── __init__.py
└── test.py

3. 具体介绍

config.py中有一个字典,可以配置任意参数

cfg = dict(
    a=1,
    b=2,
    name='add',
)

__init__.py中包含将字典转为类的方法

import importlib

class cfg_dict(object):
    def __init__(self, d):
        self.__dict__ = d
        self.get = d.get

def set_cfg_from_file(cfg_path):
    spec = importlib.util.spec_from_file_location('cfg_file', cfg_path)
    cfg_file = importlib.util.module_from_spec(spec)
    spec_loader = spec.loader.exec_module(cfg_file)
    cfg = cfg_file.cfg
    return cfg_dict(cfg)

test.py中为主程序

import argparse
from configs import set_cfg_from_file

def parse_args():
    parse = argparse.ArgumentParser()
    parse.add_argument('--config', dest='config', type=str,
                       default='configs/config.py',)
    return parse.parse_args()

args = parse_args()
cfg = set_cfg_from_file(args.config)

print('a:{} and b:{} {} is {:.5f}'.format(cfg.a, cfg.b, cfg.name, cfg.a + cfg.b))

4. 运行

python test.py --config ./configs/config.py

输出如下:

a:1 and b:2 add is 3.00000
<think>我们正在回答用户关于“Python中给字典添加键值对的方法”的问题。 根据引用[1]和引用[3],我们可以总结出几种添加键值对的方法。 同时,我们也可以结合之前关于字典遍历的知识,但当前问题主要是添加键值对。 我们将介绍以下方法: 1. 使用方括号赋值:直接通过键赋值,如果键不存在则添加,存在则更新(引用[1]和引用[3])。 2. 使用`update()`方法:可以一次添加多个键值对,也可以用另一个字典或键值对序列来更新当前字典(引用[4]提到更新,但没有直接引用,但这是常见方法,可以提及)。 3. 使用字典推导式:在创建新字典添加,但通常用于创建新字典,不太适合在已有字典添加,所以可能不是重点。 4. 使用`setdefault()`方法:如果键不存在,则设置默认值并添加,如果存在则忽略(不更新值)或返回已有值。但这个方法主要用于确保键存在,添加是附带效果。 注意:用户引用中提到了几种创建并添加的方法,但我们重点在添加(即字典已存在,如何添加新键值对)。 因此,我们主要介绍前两种方法,并简要提一下后两种。 另外,引用[4]提到了删除,但用户问题是添加,所以我们不展开删除。 步骤: 1. 介绍方括号法(重点) 2. 介绍update方法(重点) 3. 简要介绍setdefault 4. 字典推导式(在已有字典基础上添加可以合并两个字典,但我们也可以介绍合并字典的方法,比如使用|运算符(Python 3.9+)或**解包) 但为了不偏离主题,我们主要介绍前两种。 同时,根据引用[3],方括号法既可以修改(更新)也可以新增,这里我们强调新增(当键不存在时)。 注意:引用[1]中有三种方法,其中方法一和方法二都是先创建空字典再用方括号添加,方法三是创建时直接添加,但创建后也可以继续用方括号添加。 因此,我们这样组织: 一、使用方括号赋值添加单个键值对 示例代码,并说明如果键不存在则添加,存在则更新。 二、使用update()方法添加多个键值对 可以传入一个字典,或者可迭代的键值对(如元组列表),或者关键字参数。 三、其他方法 1. setdefault():当键不存在时设置默认值(添加),存在则返回已有值而不更新。 2. 合并字典添加多个键值对):使用|运算符(Python 3.9+)或{**d1, **d2}(Python 3.5+)来合并两个字典,但注意这会创建新字典。 最后,根据用户引用[1]中的示例,我们也展示一个完整的创建并添加的过程。 由于用户要求“查找在Python中给字典添加键值对的方法”,我们应给出明确的代码示例。 注意事项:在循环中动态添加键值对是安全的,但通常避免在遍历时修改字典结构(如删除),添加一般没问题,但可能改变遍历过程(新添加的键值对也可能在后面被遍历到,取决于遍历方法)。 下面开始组织回答: </think>### Python字典添加键值对的方法 在Python添加字典键值对主要有以下几种方法,这些方法都遵循字典的动态特性(无需预定义大小): #### 1. 方括号赋值法(最常用) ```python # 创建空字典 person = {} # 添加键值对 person['name'] = 'Alice' # 添加字符串值 person['age'] = 30 # 添加整数值 person['skills'] = ['Python', 'SQL'] # 添加列表值 print(person) # 输出: {'name': 'Alice', 'age': 30, 'skills': ['Python', 'SQL']} ``` **特点**: - 键不存在时自动添加新键值对 - 键存在时更新已有值[^3] - 时间复杂度:$O(1)$ #### 2. `update()`方法(批量添加) ```python # 创建初始字典 config = {'debug': True} # 添加多个键值对 config.update({'log_level': 'INFO', 'timeout': 60}) # 也可直接传入键值对 config.update(version="1.2", max_connections=100) print(config) # 输出: {'debug': True, 'log_level': 'INFO', 'timeout': 60, 'version': '1.2', 'max_connections': 100} ``` **适用场景**: - 批量添加来自其他字典/可迭代对象的键值对 - 合并多个字典内容[^4] #### 3. `setdefault()`方法(条件添加) ```python inventory = {'apples': 5, 'oranges': 3} # 只在键不存在时添加 inventory.setdefault('bananas', 0) # 添加新键 inventory.setdefault('apples', 10) # 已存在,不更新 print(inventory) # 输出: {'apples': 5, 'oranges': 3, 'bananas': 0} ``` **特点**: - 安全添加,避免意外覆盖 - 返回键的当前值(存在时)或新设置值(不存在时) #### 4. 字典字面量扩展(Python 3.9+) ```python base = {'x': 1, 'y': 2} new_items = {'z': 3, 'color': 'blue'} # 使用 | 运算符合并 combined = base | new_items print(combined) # {'x': 1, 'y': 2, 'z': 3, 'color': 'blue'} # 原地更新 base |= {'scale': 0.5} print(base) # {'x': 1, 'y': 2, 'scale': 0.5} ``` ### 添加键值对的注意事项 1. **键的要求**: - 必须是**不可变类型**(字符串、数字、元组) - 禁止使用列表等可变类型作为键 ```python invalid = {['temp']: 'value'} # TypeError: unhashable type: 'list' ``` 2. **值类型灵活**: - 支持任意Python对象 - 可嵌套其他字典 ```python employee = {} employee['contact'] = {'email': 'alice@example.com', 'phone': '123-4567'} ``` 3. **性能考量**: - 添加操作平均时间复杂度为 $O(1)$ - 大量添加时建议预分配空间: ```python large_dict = {} large_dict.update((str(i), i**2) for i in range(10000)) ``` ### 应用场景建议 | **方法** | **最佳使用场景** | |------------------|------------------------------------------| | 方括号赋值 | 单次添加/修改操作 | | `update()` | 批量添加或合并多个数据源 | | `setdefault()` | 需要初始化默认值的场景 | | `|` 运算符 | Python 3.9+环境下的字典合并 | 这些方法共同构成了Python字典动态添加数据的核心能力[^1][^2],可根据具体需求选择最合适的方式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值