confull


Nameconfull JSON
Version 0.0.5 PyPI version JSON
download
home_pageNone
Summary一个简单的配置管理工具(A simple dictionary configuration management tool),dict <-> config file [json, toml, yaml, ini, xml]
upload_time2025-07-13 13:56:13
maintainerNone
docs_urlNone
authorzisul
requires_python<4.0,>=3.6
licenseMIT
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"
}
        
Elapsed time: 1.69301s