Name | confull JSON |
Version |
0.0.5
JSON |
| download |
home_page | None |
Summary | 一个简单的配置管理工具(A simple dictionary configuration management tool),dict <-> config file [json, toml, yaml, ini, xml] |
upload_time | 2025-07-13 13:56:13 |
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`、`data`),也可安全读写
- 自动补全(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.write('user', 'admin')
print(cc.read('user')) # admin
# 2. 加密用法
cc = Config(file='secure.toml', way='toml', pwd='123456')
cc.write('token', 'xyz')
print(cc.read('token')) # xyz
# 3. 点路径写入和读取
cc.write('db.host', '127.0.0.1', overwrite_mode=True)
cc.write('db.port', 3306, overwrite_mode=True)
print(cc.read('db.host')) # 127.0.0.1
print(cc.read('db.port')) # 3306
# 4. dict方式批量赋值
cc.dict = {'user': 'root', 'password': 'pass'}
print(cc['user']) # root
# 5. 属性方式赋值和读取
cc.site = 'mysite'
print(cc.site) # mysite
# 6. 删除配置项
cc.del_key('user')
print(cc.read('user')) # None
# 7. 批量更新
cc.update({'email': 'a@b.com', 'db.host': 'localhost'})
print(cc.read('email')) # a@b.com
print(cc.read('db.host')) # localhost
# 8. 清空并删除配置文件
cc.del_clean()
# 9. 另存为其他格式
cc = Config({'user': 'admin'}, file='a.toml', way='toml')
cc.save_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`。
#### 属性
| 属性名 | 描述 |
| --------------- | ------------------------------------------------------ |
| `json` | 以 json 字符串格式返回配置数据。 |
| `dict` | 以 `dict` 格式返回配置数据,也可用于批量设置配置数据。 |
| `auto_save` | 是否自动保存,可读写属性。 |
| `process_safe` | 是否启用跨进程锁;`True` 进程安全,`False` 禁用加速。 |
| `str` | 以字符串格式返回配置数据。 |
| `file_path` | 配置文件路径。 |
| `file_path_abs` | 配置文件绝对路径。 |
#### 方法
| 方法名 | 描述 |
| ------------------------------------------------------ | ------------------------------------------------------------ |
| `read(key: str, default=None)` | 读取配置项,支持点号路径,如 `a.b.c`。若配置项不存在,返回默认值。 |
| `write(key: str, value, overwrite_mode: bool = False)` | 写入配置项,支持点号路径。若 `overwrite_mode` 为 `True`,路径冲突时会覆盖。写入后若 `auto_save` 为 `True`,则自动保存。 |
| `del_clean()` | 清空所有配置并删除配置文件。 |
| `update(data: dict)` | 批量更新配置项,支持点号路径。更新后若 `auto_save` 为 `True`,则自动保存。 |
| `set_data(data: dict)` | 用 `dict` 完全替换配置数据。替换后若 `auto_save` 为 `True`,则自动保存。 |
| `del_key(key: str)` | 删除指定配置项,支持点号路径。删除后若 `auto_save` 为 `True`,则自动保存。 |
| `_load()` | 从文件加载配置,内部方法。 |
| `load(file: str = None, way: str = None)` | 切换配置文件或格式(不自动加载内容)。 |
| `mark_dirty()` | 标记配置已更改。 |
| `save()` | 保存配置到文件。 |
| `save_to_file(file: str = None, way: str = None)` | 另存为指定文件和格式。 |
| `_ensure_file_exists()` | 确保配置文件存在,内部方法。 |
| `_recursive_update(original, new_data)` | 递归更新配置,支持点号路径,内部方法。 |
| `validate_format(_way)` | 校验并返回合法格式名,静态方法。 |
| `ensure_extension(file)` | 确保文件名有正确扩展名。 |
#### 魔法方法
| 魔法方法名 | 描述 |
| ------------------------------------------- | ------------------------------------------------------ |
| `__del__()` | 对象销毁时,若 `auto_save` 为 `True`,会自动保存配置。 |
| `__getattr__(self, item)` | 属性访问代理到配置数据。 |
| `__getitem__(self, item)` | `dict` 方式访问配置数据。 |
| `__call__(self, key, value=None)` | `cc(key)` 等价于 `cc.read(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)` | 属性删除代理到配置数据。 |
---
zisull@qq.com
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/ee/44/5699b74dc4d5f462fa971a1dd3eefec5e1640ac5cdf9716c46be4b52adfa/confull-0.0.5.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- \u6570\u636e\u4f18\u5148\uff1a\u5373\u4f7f\u952e\u540d\u4e0e\u5185\u90e8\u65b9\u6cd5\u540c\u540d\uff08\u5982 `to_dict`\u3001`data`\uff09\uff0c\u4e5f\u53ef\u5b89\u5168\u8bfb\u5199\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.write('user', 'admin')\nprint(cc.read('user')) # admin\n\n# 2. \u52a0\u5bc6\u7528\u6cd5\ncc = Config(file='secure.toml', way='toml', pwd='123456')\ncc.write('token', 'xyz')\nprint(cc.read('token')) # xyz\n\n# 3. \u70b9\u8def\u5f84\u5199\u5165\u548c\u8bfb\u53d6\ncc.write('db.host', '127.0.0.1', overwrite_mode=True)\ncc.write('db.port', 3306, overwrite_mode=True)\nprint(cc.read('db.host')) # 127.0.0.1\nprint(cc.read('db.port')) # 3306\n\n# 4. dict\u65b9\u5f0f\u6279\u91cf\u8d4b\u503c\ncc.dict = {'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.read('user')) # None\n\n# 7. \u6279\u91cf\u66f4\u65b0\ncc.update({'email': 'a@b.com', 'db.host': 'localhost'})\nprint(cc.read('email')) # a@b.com\nprint(cc.read('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.save_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#### \u5c5e\u6027\n\n| \u5c5e\u6027\u540d | \u63cf\u8ff0 |\n| --------------- | ------------------------------------------------------ |\n| `json` | \u4ee5 json \u5b57\u7b26\u4e32\u683c\u5f0f\u8fd4\u56de\u914d\u7f6e\u6570\u636e\u3002 |\n| `dict` | \u4ee5 `dict` \u683c\u5f0f\u8fd4\u56de\u914d\u7f6e\u6570\u636e\uff0c\u4e5f\u53ef\u7528\u4e8e\u6279\u91cf\u8bbe\u7f6e\u914d\u7f6e\u6570\u636e\u3002 |\n| `auto_save` | \u662f\u5426\u81ea\u52a8\u4fdd\u5b58\uff0c\u53ef\u8bfb\u5199\u5c5e\u6027\u3002 |\n| `process_safe` | \u662f\u5426\u542f\u7528\u8de8\u8fdb\u7a0b\u9501\uff1b`True` \u8fdb\u7a0b\u5b89\u5168\uff0c`False` \u7981\u7528\u52a0\u901f\u3002 |\n| `str` | \u4ee5\u5b57\u7b26\u4e32\u683c\u5f0f\u8fd4\u56de\u914d\u7f6e\u6570\u636e\u3002 |\n| `file_path` | \u914d\u7f6e\u6587\u4ef6\u8def\u5f84\u3002 |\n| `file_path_abs` | \u914d\u7f6e\u6587\u4ef6\u7edd\u5bf9\u8def\u5f84\u3002 |\n\n#### \u65b9\u6cd5\n\n| \u65b9\u6cd5\u540d | \u63cf\u8ff0 |\n| ------------------------------------------------------ | ------------------------------------------------------------ |\n| `read(key: str, default=None)` | \u8bfb\u53d6\u914d\u7f6e\u9879\uff0c\u652f\u6301\u70b9\u53f7\u8def\u5f84\uff0c\u5982 `a.b.c`\u3002\u82e5\u914d\u7f6e\u9879\u4e0d\u5b58\u5728\uff0c\u8fd4\u56de\u9ed8\u8ba4\u503c\u3002 |\n| `write(key: str, value, overwrite_mode: bool = False)` | \u5199\u5165\u914d\u7f6e\u9879\uff0c\u652f\u6301\u70b9\u53f7\u8def\u5f84\u3002\u82e5 `overwrite_mode` \u4e3a `True`\uff0c\u8def\u5f84\u51b2\u7a81\u65f6\u4f1a\u8986\u76d6\u3002\u5199\u5165\u540e\u82e5 `auto_save` \u4e3a `True`\uff0c\u5219\u81ea\u52a8\u4fdd\u5b58\u3002 |\n| `del_clean()` | \u6e05\u7a7a\u6240\u6709\u914d\u7f6e\u5e76\u5220\u9664\u914d\u7f6e\u6587\u4ef6\u3002 |\n| `update(data: dict)` | \u6279\u91cf\u66f4\u65b0\u914d\u7f6e\u9879\uff0c\u652f\u6301\u70b9\u53f7\u8def\u5f84\u3002\u66f4\u65b0\u540e\u82e5 `auto_save` \u4e3a `True`\uff0c\u5219\u81ea\u52a8\u4fdd\u5b58\u3002 |\n| `set_data(data: dict)` | \u7528 `dict` \u5b8c\u5168\u66ff\u6362\u914d\u7f6e\u6570\u636e\u3002\u66ff\u6362\u540e\u82e5 `auto_save` \u4e3a `True`\uff0c\u5219\u81ea\u52a8\u4fdd\u5b58\u3002 |\n| `del_key(key: str)` | \u5220\u9664\u6307\u5b9a\u914d\u7f6e\u9879\uff0c\u652f\u6301\u70b9\u53f7\u8def\u5f84\u3002\u5220\u9664\u540e\u82e5 `auto_save` \u4e3a `True`\uff0c\u5219\u81ea\u52a8\u4fdd\u5b58\u3002 |\n| `_load()` | \u4ece\u6587\u4ef6\u52a0\u8f7d\u914d\u7f6e\uff0c\u5185\u90e8\u65b9\u6cd5\u3002 |\n| `load(file: str = None, way: str = None)` | \u5207\u6362\u914d\u7f6e\u6587\u4ef6\u6216\u683c\u5f0f\uff08\u4e0d\u81ea\u52a8\u52a0\u8f7d\u5185\u5bb9\uff09\u3002 |\n| `mark_dirty()` | \u6807\u8bb0\u914d\u7f6e\u5df2\u66f4\u6539\u3002 |\n| `save()` | \u4fdd\u5b58\u914d\u7f6e\u5230\u6587\u4ef6\u3002 |\n| `save_to_file(file: str = None, way: str = None)` | \u53e6\u5b58\u4e3a\u6307\u5b9a\u6587\u4ef6\u548c\u683c\u5f0f\u3002 |\n| `_ensure_file_exists()` | \u786e\u4fdd\u914d\u7f6e\u6587\u4ef6\u5b58\u5728\uff0c\u5185\u90e8\u65b9\u6cd5\u3002 |\n| `_recursive_update(original, new_data)` | \u9012\u5f52\u66f4\u65b0\u914d\u7f6e\uff0c\u652f\u6301\u70b9\u53f7\u8def\u5f84\uff0c\u5185\u90e8\u65b9\u6cd5\u3002 |\n| `validate_format(_way)` | \u6821\u9a8c\u5e76\u8fd4\u56de\u5408\u6cd5\u683c\u5f0f\u540d\uff0c\u9759\u6001\u65b9\u6cd5\u3002 |\n| `ensure_extension(file)` | \u786e\u4fdd\u6587\u4ef6\u540d\u6709\u6b63\u786e\u6269\u5c55\u540d\u3002 |\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.read(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\nzisull@qq.com\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.5",
"project_urls": null,
"split_keywords": [
"configuration",
" toml",
" yaml",
" json",
" ini",
" xml"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "f896da401e5e22a6cbc6d3e3a0c4d22ac87faec81f4025104ebdb720ccf1ed2f",
"md5": "9d5295d5de1d16d8fa49464fcb362661",
"sha256": "80b9f15bd8a5c587e89695190a9a719b569cd7ca92aba96afb9bf32b8592dca7"
},
"downloads": -1,
"filename": "confull-0.0.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9d5295d5de1d16d8fa49464fcb362661",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.6",
"size": 17307,
"upload_time": "2025-07-13T13:56:12",
"upload_time_iso_8601": "2025-07-13T13:56:12.308836Z",
"url": "https://files.pythonhosted.org/packages/f8/96/da401e5e22a6cbc6d3e3a0c4d22ac87faec81f4025104ebdb720ccf1ed2f/confull-0.0.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ee445699b74dc4d5f462fa971a1dd3eefec5e1640ac5cdf9716c46be4b52adfa",
"md5": "ae5865b5428e25a0516ba3d6ea0ecb46",
"sha256": "095222947a28b8c61380e89b5966b3605a638819e60ed6ac6f6303cccd613755"
},
"downloads": -1,
"filename": "confull-0.0.5.tar.gz",
"has_sig": false,
"md5_digest": "ae5865b5428e25a0516ba3d6ea0ecb46",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.6",
"size": 15379,
"upload_time": "2025-07-13T13:56:13",
"upload_time_iso_8601": "2025-07-13T13:56:13.992978Z",
"url": "https://files.pythonhosted.org/packages/ee/44/5699b74dc4d5f462fa971a1dd3eefec5e1640ac5cdf9716c46be4b52adfa/confull-0.0.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-13 13:56:13",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "confull"
}