Name | confull JSON |
Version |
0.0.7
JSON |
| download |
home_page | None |
Summary | 一个简单的配置管理工具(A simple dictionary configuration management tool),dict <-> config file [json, toml, yaml, ini, xml] |
upload_time | 2025-07-15 07:48:35 |
maintainer | None |
docs_url | None |
author | zisul |
requires_python | <4.0,>=3.6 |
license | MIT |
keywords |
configuration
toml
yaml
json
ini
xml
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# confull
[Zh](https://github.com/zisull/confull/blob/main/README.md) / [AI](https://github.com/zisull/confull/blob/main/doc/README-ai-zh.md)
## 目录
- [主要特性](#主要特性)
- [变更说明](#变更说明)
- [使用示例](#使用示例)
- [安装](#安装)
- [类和方法说明](#类和方法说明)
## 一、概述
`confull` 是一款多格式配置管理工具,支持在 `dict` 与 `ini`、`xml`、`json`、`toml`、`yaml` 等格式之间进行读写操作,并能自动保存配置。提供便捷的接口管理配置数据,并可根据需求灵活切换配置文件和格式。
### 主要特性
- 支持多种配置文件格式:json、toml、yaml、ini、xml
- 支持 dict <=> 配置文件的自动转换
- 支持点号路径(如 a.b.c)方式的访问和写入
- 支持自动保存(即时持久化,无延迟)
- 支持加密存储(传入 pwd 参数即可自动加密和解密配置文件)
- 线程安全
- 支持文件变更监听 (`enable_watch` / `disable_watch`),外部修改后自动重载
- 进程安全:可选 `portalocker` 跨进程锁 (`process_safe=False` 默认关闭,可设为 True 以跨进程安全)
- 键名冲突防护:若顶层键名与内部接口同名(如 `to_dict`、`del_clean` 等)将抛出 `AttributeError`,避免意外覆盖
- 自动补全(Autovivification):链式赋值时自动创建中间节点
### 变更说明
- **已移除备份功能**,简化配置管理。
- **新增加密功能**,只需传入 `pwd` 参数,即可自动加密和解密配置文件。
### 使用示例(新增文件监听)
```python
from confull import Config
cfg = Config(file='watch_demo.toml')
# 开启监听:当 watch_demo.toml 被外部程序修改后,cfg 会自动 reload()
cfg.enable_watch()
# 1. 普通用法
cc = Config()
cc.set('user', 'admin')
print(cc.get('user')) # admin
# 2. 加密用法
cc = Config(file='secure.toml', way='toml', pwd='123456')
cc.set('token', 'xyz')
print(cc.get('token')) # xyz
# 3. 点路径写入和读取
cc.set('db.host', '127.0.0.1', overwrite_mode=True)
cc.set('db.port', 3306, overwrite_mode=True)
print(cc.get('db.host')) # 127.0.0.1
print(cc.get('db.port')) # 3306
# 4. dict方式批量赋值
cc.set_data({'user': 'root', 'password': 'pass'})
print(cc['user']) # root
# 5. 属性方式赋值和读取
cc.site = 'mysite'
print(cc.site) # mysite
# 6. 删除配置项
cc.del_key('user')
print(cc.get('user')) # None
# 7. 批量更新
cc.update({'email': 'a@b.com', 'db.host': 'localhost'})
print(cc.get('email')) # a@b.com
print(cc.get('db.host')) # localhost
# 8. 清空并删除配置文件
cc.del_clean()
# 9. 另存为其他格式
cc = Config({'user': 'admin'}, file='a.toml', way='toml')
cc.to_file(file='a.yaml', way='yaml')
# 若不再需要监听,可关闭
cfg.disable_watch()
# 进程安全开关示例(高级场景)
cfg_safe = Config(file='shared.toml', process_safe=True) # 默认即安全
cfg_fast = Config(file='shared.toml', process_safe=False) # 关闭进程锁,单进程场景
```
---
## 二、安装
在命令行中运行以下命令来安装 `confull`:
```bash
# 推荐使用 PyPI 包(已自动处理依赖)
pip install confull
# 若手动安装依赖,可执行
pip install orjson toml pyyaml watchdog portalocker configparser
```
---
## 三、类和方法说明
### 1. `Config` 类
该类是配置管理器的核心,负责配置数据的读写、保存等操作。
#### 初始化方法 `__init__`
```python
def __init__(self,
data: dict | None = None,
file: str = "config",
way: str = "toml",
replace: bool = False,
auto_save: bool = True,
pwd: str | None = None,
process_safe: bool = False):
```
- 新增参数 `pwd`,用于加密配置文件。
- 已移除参数 `backup`。
#### 核心方法速查
| 方法 | 说明 |
|------|------|
| `get(key, default=None)` | 读取键,支持点路径 |
| `set(key, value, *, overwrite_mode=False)` | 写入键;标量↔️字典冲突须 `overwrite_mode=True` |
| `update(dict_like)` | 批量写入(点路径支持) |
| `del_key(key)` | 删除键 |
| `del_clean()` | 清空并删除配置文件 |
| `to_dict()` | 返回深拷贝 `dict` 数据 |
| `to_json(indent=2)` | JSON 字符串 |
| `is_auto_save()` / `set_auto_save(flag)` | 获取 / 设置自动保存状态 |
| `path()` / `path_abs()` | 相对 / 绝对路径 |
| `save()` | 立即保存(忽略去抖) |
| `to_file(file, way)` | 另存为其它文件 / 格式 |
| `enable_watch()` / `disable_watch()` | 开 / 关文件监听 |
#### 魔法方法
| 魔法方法名 | 描述 |
| ------------------------------------------- | ------------------------------------------------------ |
| `__del__()` | 对象销毁时,若 `auto_save` 为 `True`,会自动保存配置。 |
| `__getattr__(self, item)` | 属性访问代理到配置数据。 |
| `__getitem__(self, item)` | `dict` 方式访问配置数据。 |
| `__call__(self, key, value=None)` | `cc(key)` 等价于 `cc.get(key, value)`。 |
| `__len__(self)` | 配置项数量。 |
| `__iter__(self)` | 遍历配置项。 |
| `__contains__(self, item)` | 判断配置项是否存在。 |
| `__bool__(self)` | 配置是否非空。 |
| `__enter__(self)` | 上下文管理器 `enter`。 |
| `__exit__(self, exc_type, exc_val, exc_tb)` | 上下文管理器 `exit`,自动保存。 |
| `__setattr__(self, key, value)` | 属性赋值代理到配置数据,内部属性用 `_` 前缀。 |
| `__delattr__(self, key)` | 属性删除代理到配置数据。 |
---
## 四、使用技巧与注意事项
### 4.1 常见注意事项
1. **键名冲突** – 顶层键若与 `_CONF_RESERVED` 列表冲突会抛 `AttributeError`;若必须使用类似名字,请放到子节点中,如 `meta.to_dict`。
2. **去抖延迟** – 频繁写场景请设置 `debounce_ms`(毫秒)。0 表示立即保存;100–500 ms 可显著降低磁盘 I/O。
3. **进程锁 vs 性能** – `process_safe=True` 可避免多进程竞争,但在单进程密集写时略微降低速度;可按需关闭。
4. **加密不可逆** – 丢失密码将无法解密;文件被篡改会触发 HMAC 校验错误并拒绝加载。
5. **watchdog** – 监听线程以 `DirWatcher-<id>` 命名;在单元测试结束应 `disable_watch()` 关闭,避免残留线程。
### 4.2 高级示例
```python
from confull import Config
# 1) 加密 + 去抖保存(100 ms),支持 toml
cfg = Config({'token': 'abc'}, file='secure.toml', pwd='secret', debounce_ms=100)
cfg.set('log.level', 'INFO')
# 2) 上下文批量操作
with Config(file='batch.yaml', auto_save=False) as c:
c.set_data({'app': {'ver': '1.2'}, 'features': ['x', 'y']})
c.to_file('backup.json', way='json') # 退出时自动 save()
# 3) 开启文件监听
cfg_watch = Config(file='live.toml')
cfg_watch.enable_watch()
# 4) 进程安全共享配置
shared = Config(file='shared.toml', process_safe=True)
# ... 跨进程读写
# 5) 清理
shared.del_clean()
```
### 4.3 玩法小技巧
* **链式赋值** – `cfg.app.version.build = 5` 可一次性创建深层键。
* **函数式读取** – `value = cfg('a.b', default=0)` 等价于 `cfg.get(...)`,适合快速取值。
* **混合更新** – `update({'a': 1, 'b.c': 2})` 同时支持顶层与点路径键。
* **动态格式切换** – 任意时刻可 `cfg.load(file='x.yaml', way='yaml')` 改写目标文件与格式。
* **安全回收** – `del_clean()` 在单元测试或临时文件场景快速清理磁盘与内存。
* **只读模式** – 将配置文件权限设为只读,仍可使用 `get()` 快速获取数据;写入将抛出异常,可用于生产只读节点。
* **跨模块共享** – 在不同模块中 `Config(file='same.toml')` 打开同一文件,实现配置中心。
---
Raw data
{
"_id": null,
"home_page": null,
"name": "confull",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.6",
"maintainer_email": null,
"keywords": "configuration, toml, yaml, json, ini, xml",
"author": "zisul",
"author_email": "zisull@qq.com",
"download_url": "https://files.pythonhosted.org/packages/74/19/be3483ebdad769af18f605a25a39be133f4090167eaffec619599fc62447/confull-0.0.7.tar.gz",
"platform": null,
"description": "# confull\n\n[Zh](https://github.com/zisull/confull/blob/main/README.md) / [AI](https://github.com/zisull/confull/blob/main/doc/README-ai-zh.md)\n\n## \u76ee\u5f55\n\n- [\u4e3b\u8981\u7279\u6027](#\u4e3b\u8981\u7279\u6027)\n- [\u53d8\u66f4\u8bf4\u660e](#\u53d8\u66f4\u8bf4\u660e)\n- [\u4f7f\u7528\u793a\u4f8b](#\u4f7f\u7528\u793a\u4f8b)\n- [\u5b89\u88c5](#\u5b89\u88c5)\n- [\u7c7b\u548c\u65b9\u6cd5\u8bf4\u660e](#\u7c7b\u548c\u65b9\u6cd5\u8bf4\u660e)\n\n## \u4e00\u3001\u6982\u8ff0\n\n`confull` \u662f\u4e00\u6b3e\u591a\u683c\u5f0f\u914d\u7f6e\u7ba1\u7406\u5de5\u5177\uff0c\u652f\u6301\u5728 `dict` \u4e0e `ini`\u3001`xml`\u3001`json`\u3001`toml`\u3001`yaml` \u7b49\u683c\u5f0f\u4e4b\u95f4\u8fdb\u884c\u8bfb\u5199\u64cd\u4f5c\uff0c\u5e76\u80fd\u81ea\u52a8\u4fdd\u5b58\u914d\u7f6e\u3002\u63d0\u4f9b\u4fbf\u6377\u7684\u63a5\u53e3\u7ba1\u7406\u914d\u7f6e\u6570\u636e\uff0c\u5e76\u53ef\u6839\u636e\u9700\u6c42\u7075\u6d3b\u5207\u6362\u914d\u7f6e\u6587\u4ef6\u548c\u683c\u5f0f\u3002\n\n### \u4e3b\u8981\u7279\u6027\n- \u652f\u6301\u591a\u79cd\u914d\u7f6e\u6587\u4ef6\u683c\u5f0f\uff1ajson\u3001toml\u3001yaml\u3001ini\u3001xml\n- \u652f\u6301 dict <=> \u914d\u7f6e\u6587\u4ef6\u7684\u81ea\u52a8\u8f6c\u6362\n- \u652f\u6301\u70b9\u53f7\u8def\u5f84\uff08\u5982 a.b.c\uff09\u65b9\u5f0f\u7684\u8bbf\u95ee\u548c\u5199\u5165\n- \u652f\u6301\u81ea\u52a8\u4fdd\u5b58\uff08\u5373\u65f6\u6301\u4e45\u5316\uff0c\u65e0\u5ef6\u8fdf\uff09\n- \u652f\u6301\u52a0\u5bc6\u5b58\u50a8\uff08\u4f20\u5165 pwd \u53c2\u6570\u5373\u53ef\u81ea\u52a8\u52a0\u5bc6\u548c\u89e3\u5bc6\u914d\u7f6e\u6587\u4ef6\uff09\n- \u7ebf\u7a0b\u5b89\u5168\n- \u652f\u6301\u6587\u4ef6\u53d8\u66f4\u76d1\u542c (`enable_watch` / `disable_watch`)\uff0c\u5916\u90e8\u4fee\u6539\u540e\u81ea\u52a8\u91cd\u8f7d\n- \u8fdb\u7a0b\u5b89\u5168\uff1a\u53ef\u9009 `portalocker` \u8de8\u8fdb\u7a0b\u9501 (`process_safe=False` \u9ed8\u8ba4\u5173\u95ed\uff0c\u53ef\u8bbe\u4e3a True \u4ee5\u8de8\u8fdb\u7a0b\u5b89\u5168)\n- \u952e\u540d\u51b2\u7a81\u9632\u62a4\uff1a\u82e5\u9876\u5c42\u952e\u540d\u4e0e\u5185\u90e8\u63a5\u53e3\u540c\u540d\uff08\u5982 `to_dict`\u3001`del_clean` \u7b49\uff09\u5c06\u629b\u51fa `AttributeError`\uff0c\u907f\u514d\u610f\u5916\u8986\u76d6\n- \u81ea\u52a8\u8865\u5168\uff08Autovivification\uff09\uff1a\u94fe\u5f0f\u8d4b\u503c\u65f6\u81ea\u52a8\u521b\u5efa\u4e2d\u95f4\u8282\u70b9\n\n### \u53d8\u66f4\u8bf4\u660e\n\n- **\u5df2\u79fb\u9664\u5907\u4efd\u529f\u80fd**\uff0c\u7b80\u5316\u914d\u7f6e\u7ba1\u7406\u3002\n- **\u65b0\u589e\u52a0\u5bc6\u529f\u80fd**\uff0c\u53ea\u9700\u4f20\u5165 `pwd` \u53c2\u6570\uff0c\u5373\u53ef\u81ea\u52a8\u52a0\u5bc6\u548c\u89e3\u5bc6\u914d\u7f6e\u6587\u4ef6\u3002\n\n### \u4f7f\u7528\u793a\u4f8b\uff08\u65b0\u589e\u6587\u4ef6\u76d1\u542c\uff09\n\n```python\nfrom confull import Config\n\ncfg = Config(file='watch_demo.toml')\n\n# \u5f00\u542f\u76d1\u542c\uff1a\u5f53 watch_demo.toml \u88ab\u5916\u90e8\u7a0b\u5e8f\u4fee\u6539\u540e\uff0ccfg \u4f1a\u81ea\u52a8 reload()\ncfg.enable_watch()\n\n# 1. \u666e\u901a\u7528\u6cd5\ncc = Config()\ncc.set('user', 'admin')\nprint(cc.get('user')) # admin\n\n# 2. \u52a0\u5bc6\u7528\u6cd5\ncc = Config(file='secure.toml', way='toml', pwd='123456')\ncc.set('token', 'xyz')\nprint(cc.get('token')) # xyz\n\n# 3. \u70b9\u8def\u5f84\u5199\u5165\u548c\u8bfb\u53d6\ncc.set('db.host', '127.0.0.1', overwrite_mode=True)\ncc.set('db.port', 3306, overwrite_mode=True)\nprint(cc.get('db.host')) # 127.0.0.1\nprint(cc.get('db.port')) # 3306\n\n# 4. dict\u65b9\u5f0f\u6279\u91cf\u8d4b\u503c\ncc.set_data({'user': 'root', 'password': 'pass'})\nprint(cc['user']) # root\n\n# 5. \u5c5e\u6027\u65b9\u5f0f\u8d4b\u503c\u548c\u8bfb\u53d6\ncc.site = 'mysite'\nprint(cc.site) # mysite\n\n# 6. \u5220\u9664\u914d\u7f6e\u9879\ncc.del_key('user')\nprint(cc.get('user')) # None\n\n# 7. \u6279\u91cf\u66f4\u65b0\ncc.update({'email': 'a@b.com', 'db.host': 'localhost'})\nprint(cc.get('email')) # a@b.com\nprint(cc.get('db.host')) # localhost\n\n# 8. \u6e05\u7a7a\u5e76\u5220\u9664\u914d\u7f6e\u6587\u4ef6\ncc.del_clean()\n\n# 9. \u53e6\u5b58\u4e3a\u5176\u4ed6\u683c\u5f0f\ncc = Config({'user': 'admin'}, file='a.toml', way='toml')\ncc.to_file(file='a.yaml', way='yaml')\n\n# \u82e5\u4e0d\u518d\u9700\u8981\u76d1\u542c\uff0c\u53ef\u5173\u95ed\ncfg.disable_watch()\n\n# \u8fdb\u7a0b\u5b89\u5168\u5f00\u5173\u793a\u4f8b\uff08\u9ad8\u7ea7\u573a\u666f\uff09\ncfg_safe = Config(file='shared.toml', process_safe=True) # \u9ed8\u8ba4\u5373\u5b89\u5168\ncfg_fast = Config(file='shared.toml', process_safe=False) # \u5173\u95ed\u8fdb\u7a0b\u9501\uff0c\u5355\u8fdb\u7a0b\u573a\u666f\n```\n\n---\n\n## \u4e8c\u3001\u5b89\u88c5\n\n\u5728\u547d\u4ee4\u884c\u4e2d\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\u6765\u5b89\u88c5 `confull`\uff1a\n\n```bash\n# \u63a8\u8350\u4f7f\u7528 PyPI \u5305\uff08\u5df2\u81ea\u52a8\u5904\u7406\u4f9d\u8d56\uff09\npip install confull\n\n# \u82e5\u624b\u52a8\u5b89\u88c5\u4f9d\u8d56\uff0c\u53ef\u6267\u884c\npip install orjson toml pyyaml watchdog portalocker configparser\n```\n\n---\n\n## \u4e09\u3001\u7c7b\u548c\u65b9\u6cd5\u8bf4\u660e\n\n### 1. `Config` \u7c7b\n\n\u8be5\u7c7b\u662f\u914d\u7f6e\u7ba1\u7406\u5668\u7684\u6838\u5fc3\uff0c\u8d1f\u8d23\u914d\u7f6e\u6570\u636e\u7684\u8bfb\u5199\u3001\u4fdd\u5b58\u7b49\u64cd\u4f5c\u3002\n\n#### \u521d\u59cb\u5316\u65b9\u6cd5 `__init__`\n\n```python\ndef __init__(self,\n data: dict | None = None,\n file: str = \"config\",\n way: str = \"toml\",\n replace: bool = False,\n auto_save: bool = True,\n pwd: str | None = None,\n process_safe: bool = False):\n```\n- \u65b0\u589e\u53c2\u6570 `pwd`\uff0c\u7528\u4e8e\u52a0\u5bc6\u914d\u7f6e\u6587\u4ef6\u3002\n- \u5df2\u79fb\u9664\u53c2\u6570 `backup`\u3002\n\n#### \u6838\u5fc3\u65b9\u6cd5\u901f\u67e5\n\n| \u65b9\u6cd5 | \u8bf4\u660e |\n|------|------|\n| `get(key, default=None)` | \u8bfb\u53d6\u952e\uff0c\u652f\u6301\u70b9\u8def\u5f84 |\n| `set(key, value, *, overwrite_mode=False)` | \u5199\u5165\u952e\uff1b\u6807\u91cf\u2194\ufe0f\u5b57\u5178\u51b2\u7a81\u987b `overwrite_mode=True` |\n| `update(dict_like)` | \u6279\u91cf\u5199\u5165\uff08\u70b9\u8def\u5f84\u652f\u6301\uff09 |\n| `del_key(key)` | \u5220\u9664\u952e |\n| `del_clean()` | \u6e05\u7a7a\u5e76\u5220\u9664\u914d\u7f6e\u6587\u4ef6 |\n| `to_dict()` | \u8fd4\u56de\u6df1\u62f7\u8d1d `dict` \u6570\u636e |\n| `to_json(indent=2)` | JSON \u5b57\u7b26\u4e32 |\n| `is_auto_save()` / `set_auto_save(flag)` | \u83b7\u53d6 / \u8bbe\u7f6e\u81ea\u52a8\u4fdd\u5b58\u72b6\u6001 |\n| `path()` / `path_abs()` | \u76f8\u5bf9 / \u7edd\u5bf9\u8def\u5f84 |\n| `save()` | \u7acb\u5373\u4fdd\u5b58\uff08\u5ffd\u7565\u53bb\u6296\uff09 |\n| `to_file(file, way)` | \u53e6\u5b58\u4e3a\u5176\u5b83\u6587\u4ef6 / \u683c\u5f0f |\n| `enable_watch()` / `disable_watch()` | \u5f00 / \u5173\u6587\u4ef6\u76d1\u542c |\n\n#### \u9b54\u6cd5\u65b9\u6cd5\n\n| \u9b54\u6cd5\u65b9\u6cd5\u540d | \u63cf\u8ff0 |\n| ------------------------------------------- | ------------------------------------------------------ |\n| `__del__()` | \u5bf9\u8c61\u9500\u6bc1\u65f6\uff0c\u82e5 `auto_save` \u4e3a `True`\uff0c\u4f1a\u81ea\u52a8\u4fdd\u5b58\u914d\u7f6e\u3002 |\n| `__getattr__(self, item)` | \u5c5e\u6027\u8bbf\u95ee\u4ee3\u7406\u5230\u914d\u7f6e\u6570\u636e\u3002 |\n| `__getitem__(self, item)` | `dict` \u65b9\u5f0f\u8bbf\u95ee\u914d\u7f6e\u6570\u636e\u3002 |\n| `__call__(self, key, value=None)` | `cc(key)` \u7b49\u4ef7\u4e8e `cc.get(key, value)`\u3002 |\n| `__len__(self)` | \u914d\u7f6e\u9879\u6570\u91cf\u3002 |\n| `__iter__(self)` | \u904d\u5386\u914d\u7f6e\u9879\u3002 |\n| `__contains__(self, item)` | \u5224\u65ad\u914d\u7f6e\u9879\u662f\u5426\u5b58\u5728\u3002 |\n| `__bool__(self)` | \u914d\u7f6e\u662f\u5426\u975e\u7a7a\u3002 |\n| `__enter__(self)` | \u4e0a\u4e0b\u6587\u7ba1\u7406\u5668 `enter`\u3002 |\n| `__exit__(self, exc_type, exc_val, exc_tb)` | \u4e0a\u4e0b\u6587\u7ba1\u7406\u5668 `exit`\uff0c\u81ea\u52a8\u4fdd\u5b58\u3002 |\n| `__setattr__(self, key, value)` | \u5c5e\u6027\u8d4b\u503c\u4ee3\u7406\u5230\u914d\u7f6e\u6570\u636e\uff0c\u5185\u90e8\u5c5e\u6027\u7528 `_` \u524d\u7f00\u3002 |\n| `__delattr__(self, key)` | \u5c5e\u6027\u5220\u9664\u4ee3\u7406\u5230\u914d\u7f6e\u6570\u636e\u3002 |\n\n---\n\n## \u56db\u3001\u4f7f\u7528\u6280\u5de7\u4e0e\u6ce8\u610f\u4e8b\u9879\n\n### 4.1 \u5e38\u89c1\u6ce8\u610f\u4e8b\u9879\n\n1. **\u952e\u540d\u51b2\u7a81** \u2013 \u9876\u5c42\u952e\u82e5\u4e0e `_CONF_RESERVED` \u5217\u8868\u51b2\u7a81\u4f1a\u629b `AttributeError`\uff1b\u82e5\u5fc5\u987b\u4f7f\u7528\u7c7b\u4f3c\u540d\u5b57\uff0c\u8bf7\u653e\u5230\u5b50\u8282\u70b9\u4e2d\uff0c\u5982 `meta.to_dict`\u3002\n2. **\u53bb\u6296\u5ef6\u8fdf** \u2013 \u9891\u7e41\u5199\u573a\u666f\u8bf7\u8bbe\u7f6e `debounce_ms`\uff08\u6beb\u79d2\uff09\u30020 \u8868\u793a\u7acb\u5373\u4fdd\u5b58\uff1b100\u2013500 ms \u53ef\u663e\u8457\u964d\u4f4e\u78c1\u76d8 I/O\u3002\n3. **\u8fdb\u7a0b\u9501 vs \u6027\u80fd** \u2013 `process_safe=True` \u53ef\u907f\u514d\u591a\u8fdb\u7a0b\u7ade\u4e89\uff0c\u4f46\u5728\u5355\u8fdb\u7a0b\u5bc6\u96c6\u5199\u65f6\u7565\u5fae\u964d\u4f4e\u901f\u5ea6\uff1b\u53ef\u6309\u9700\u5173\u95ed\u3002\n4. **\u52a0\u5bc6\u4e0d\u53ef\u9006** \u2013 \u4e22\u5931\u5bc6\u7801\u5c06\u65e0\u6cd5\u89e3\u5bc6\uff1b\u6587\u4ef6\u88ab\u7be1\u6539\u4f1a\u89e6\u53d1 HMAC \u6821\u9a8c\u9519\u8bef\u5e76\u62d2\u7edd\u52a0\u8f7d\u3002\n5. **watchdog** \u2013 \u76d1\u542c\u7ebf\u7a0b\u4ee5 `DirWatcher-<id>` \u547d\u540d\uff1b\u5728\u5355\u5143\u6d4b\u8bd5\u7ed3\u675f\u5e94 `disable_watch()` \u5173\u95ed\uff0c\u907f\u514d\u6b8b\u7559\u7ebf\u7a0b\u3002\n\n### 4.2 \u9ad8\u7ea7\u793a\u4f8b\n\n```python\nfrom confull import Config\n\n# 1) \u52a0\u5bc6 + \u53bb\u6296\u4fdd\u5b58\uff08100 ms\uff09\uff0c\u652f\u6301 toml\ncfg = Config({'token': 'abc'}, file='secure.toml', pwd='secret', debounce_ms=100)\ncfg.set('log.level', 'INFO')\n\n# 2) \u4e0a\u4e0b\u6587\u6279\u91cf\u64cd\u4f5c\nwith Config(file='batch.yaml', auto_save=False) as c:\n c.set_data({'app': {'ver': '1.2'}, 'features': ['x', 'y']})\n c.to_file('backup.json', way='json') # \u9000\u51fa\u65f6\u81ea\u52a8 save()\n\n# 3) \u5f00\u542f\u6587\u4ef6\u76d1\u542c\ncfg_watch = Config(file='live.toml')\ncfg_watch.enable_watch()\n\n# 4) \u8fdb\u7a0b\u5b89\u5168\u5171\u4eab\u914d\u7f6e\nshared = Config(file='shared.toml', process_safe=True)\n# ... \u8de8\u8fdb\u7a0b\u8bfb\u5199\n\n# 5) \u6e05\u7406\nshared.del_clean()\n```\n\n### 4.3 \u73a9\u6cd5\u5c0f\u6280\u5de7\n\n* **\u94fe\u5f0f\u8d4b\u503c** \u2013 `cfg.app.version.build = 5` \u53ef\u4e00\u6b21\u6027\u521b\u5efa\u6df1\u5c42\u952e\u3002\n* **\u51fd\u6570\u5f0f\u8bfb\u53d6** \u2013 `value = cfg('a.b', default=0)` \u7b49\u4ef7\u4e8e `cfg.get(...)`\uff0c\u9002\u5408\u5feb\u901f\u53d6\u503c\u3002\n* **\u6df7\u5408\u66f4\u65b0** \u2013 `update({'a': 1, 'b.c': 2})` \u540c\u65f6\u652f\u6301\u9876\u5c42\u4e0e\u70b9\u8def\u5f84\u952e\u3002\n* **\u52a8\u6001\u683c\u5f0f\u5207\u6362** \u2013 \u4efb\u610f\u65f6\u523b\u53ef `cfg.load(file='x.yaml', way='yaml')` \u6539\u5199\u76ee\u6807\u6587\u4ef6\u4e0e\u683c\u5f0f\u3002\n* **\u5b89\u5168\u56de\u6536** \u2013 `del_clean()` \u5728\u5355\u5143\u6d4b\u8bd5\u6216\u4e34\u65f6\u6587\u4ef6\u573a\u666f\u5feb\u901f\u6e05\u7406\u78c1\u76d8\u4e0e\u5185\u5b58\u3002\n* **\u53ea\u8bfb\u6a21\u5f0f** \u2013 \u5c06\u914d\u7f6e\u6587\u4ef6\u6743\u9650\u8bbe\u4e3a\u53ea\u8bfb\uff0c\u4ecd\u53ef\u4f7f\u7528 `get()` \u5feb\u901f\u83b7\u53d6\u6570\u636e\uff1b\u5199\u5165\u5c06\u629b\u51fa\u5f02\u5e38\uff0c\u53ef\u7528\u4e8e\u751f\u4ea7\u53ea\u8bfb\u8282\u70b9\u3002\n* **\u8de8\u6a21\u5757\u5171\u4eab** \u2013 \u5728\u4e0d\u540c\u6a21\u5757\u4e2d `Config(file='same.toml')` \u6253\u5f00\u540c\u4e00\u6587\u4ef6\uff0c\u5b9e\u73b0\u914d\u7f6e\u4e2d\u5fc3\u3002\n\n---\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "\u4e00\u4e2a\u7b80\u5355\u7684\u914d\u7f6e\u7ba1\u7406\u5de5\u5177(A simple dictionary configuration management tool),dict <-> config file [json, toml, yaml, ini, xml]",
"version": "0.0.7",
"project_urls": null,
"split_keywords": [
"configuration",
" toml",
" yaml",
" json",
" ini",
" xml"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "065e6fa5fe485255259777baecae56978232f0d9845351461d3ecda4fe901a51",
"md5": "06f2f131c2a3f5c27b0fc8c90e0d2abb",
"sha256": "8f8705354de3c992b5c914e00de2631e079a20683b3a102d36b0265b8869a7ba"
},
"downloads": -1,
"filename": "confull-0.0.7-py3-none-any.whl",
"has_sig": false,
"md5_digest": "06f2f131c2a3f5c27b0fc8c90e0d2abb",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.6",
"size": 20221,
"upload_time": "2025-07-15T07:48:33",
"upload_time_iso_8601": "2025-07-15T07:48:33.888393Z",
"url": "https://files.pythonhosted.org/packages/06/5e/6fa5fe485255259777baecae56978232f0d9845351461d3ecda4fe901a51/confull-0.0.7-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7419be3483ebdad769af18f605a25a39be133f4090167eaffec619599fc62447",
"md5": "5a2f6fe541733746f6ff9df43458771a",
"sha256": "bae842fdd2887323cda0ba772fb01fcc3e3e63d2362185098b1b18a1559a9f02"
},
"downloads": -1,
"filename": "confull-0.0.7.tar.gz",
"has_sig": false,
"md5_digest": "5a2f6fe541733746f6ff9df43458771a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.6",
"size": 18071,
"upload_time": "2025-07-15T07:48:35",
"upload_time_iso_8601": "2025-07-15T07:48:35.733384Z",
"url": "https://files.pythonhosted.org/packages/74/19/be3483ebdad769af18f605a25a39be133f4090167eaffec619599fc62447/confull-0.0.7.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-15 07:48:35",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "confull"
}