apppublic/aidocs/Config.md
2025-10-05 11:23:33 +08:00

230 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# `Config.py` 技术文档
---
## 概述
`Config.py` 是一个用于加载和管理应用程序配置的 Python 模块采用单例模式Singleton确保全局配置的一致性。该模块通过执行指定的配置文件`conf/config.ini`),动态解析并构建配置对象,支持自定义节点类型和字典式访问。
此模块由 **longtop Co.** 开发,遵循开源许可证(见 LICENSE 文件),最初版本发布于 2009 年。
---
## 元信息
| 项目 | 内容 |
|------|------|
| 文件名 | `Config.py` |
| 版权所有 | © 2009 longtop Co. |
| 许可证 | 参见项目根目录下的 `LICENSE` 文件 |
| 作者 | yumoqing@gmail.com |
| 创建日期 | 2009-02-01 |
| 最后修改日期 | 2009-02-05 |
---
## 依赖项
### 内置模块
- `os`
- `sys`
### 第三方/自定义模块
- `appPublic.ExecFile.ExecFile`:用于安全执行配置脚本。
- `appPublic.dictObject.DictObject`:提供类字典的对象封装。
- `appPublic.Singleton.Singleton`:实现单例模式。
- `zope.interface`:用于接口定义(当前未使用具体接口,但已导入)。
- `folderUtils.ProgramPath`:获取程序运行主路径。
> ⚠️ 注意:以上自定义模块属于内部库,需确保在运行环境中正确安装或路径可导入。
---
## 核心类与函数
### 常量
```python
CONFIG_FILE = 'conf/config.ini'
```
默认配置文件路径,相对于程序主目录。
---
### 类:`Node`
```python
class Node(object):
pass
```
#### 说明:
最基础的空对象类,用作配置树中节点的基础类型。可用于扩展自定义配置节点行为。
#### 用途:
在配置文件中可通过 `Node()` 实例化一个空白节点,后续添加属性。
---
### 类:`Config`
```python
class Config:
__metaclass = Singleton
def __init__(self, configpath=None):
...
```
#### 功能描述:
`Config` 类是核心配置管理器,使用单例模式保证整个应用中仅存在一个配置实例。
#### 参数:
- `configpath` (str, optional): 自定义配置文件路径。若为 `None`,则使用默认路径 `ProgramPath()/conf/config.ini`
#### 初始化流程:
1. 若未传入 `configpath`,则根据 `CONFIG_FILE``ProgramPath()` 构造完整路径。
2. 使用 `ExecFile` 加载并执行配置文件。
3. 向执行环境注入以下可用类型:
- `Node`: 可创建结构化节点
- `DictObject`: 字典式对象
- `dict`: 别名为 `DictObject`,便于使用 `{}` 风格语法创建对象
4. 执行配置脚本,并捕获结果。
#### 属性:
| 属性 | 类型 | 描述 |
|------|------|------|
| `configfile` | str | 当前加载的配置文件完整路径 |
| `__execfile` | ExecFile | 负责解析和运行配置文件的执行器 |
#### 示例配置文件 (`conf/config.ini`) 内容示例:
```python
# config.ini 示例
database = DictObject(
host='localhost',
port=3306,
username='root',
password='123456'
)
server = Node()
server.host = '0.0.0.0'
server.port = 8080
users = dict(admin='admin@local', dev='dev@local')
```
上述代码将被解析成可访问的配置对象。
#### 错误处理:
如果 `self.__execfile.run()` 返回 `(False, msg)`,会在控制台打印错误信息 `(r, msg)`
---
### 函数:`getConfig(path=None)`
```python
def getConfig(path=None):
conf = Config(path)
return conf
```
#### 功能:
获取 `Config` 单例实例的便捷函数。
#### 参数:
- `path` (str, optional): 指定配置文件路径,优先级高于默认路径。
#### 返回值:
- `Config` 实例(单例)
#### 使用示例:
```python
from Config import getConfig
config = getConfig() # 使用默认路径
print(config.database.host) # 输出: localhost
# 或指定路径
custom_config = getConfig("myconf/custom.ini")
```
---
## 使用说明
### 步骤 1准备配置文件
创建 `conf/config.ini` 文件(或其他路径),内容如下:
```python
app_name = "MyApplication"
version = "1.0.0"
logging = DictObject(
level="DEBUG",
file="logs/app.log"
)
features = dict(
enable_cache=True,
max_workers=4
)
```
### 步骤 2在主程序中加载配置
```python
from Config import getConfig
cfg = getConfig()
print(cfg.app_name) # MyApplication
print(cfg.logging.level) # DEBUG
print(cfg.features.enable_cache) # True
```
---
## 设计特点
| 特性 | 描述 |
|------|------|
| ✅ 单例模式 | 确保配置全局唯一,避免重复加载 |
| ✅ 动态执行 | 支持 `.ini` 文件中编写 Python 表达式 |
| ✅ 结构化数据 | 支持 `DictObject``Node` 创建嵌套结构 |
| ✅ 可扩展性 | 易于注入新类型或上下文变量 |
| ⚠️ 安全性注意 | `ExecFile` 执行任意代码,应确保配置文件来源可信 |
---
## 注意事项
1. **安全性警告**:由于使用了代码执行机制(`ExecFile`),请确保配置文件不被恶意篡改。
2. **路径问题**`ProgramPath()` 必须返回正确的程序根路径,否则无法定位 `conf/config.ini`
3. **异常处理建议**:当前出错仅打印消息,建议增强日志记录或抛出异常。
4. **兼容性**`__metaclass = Singleton` 为旧式类写法Python 2 风格),在 Python 3 中应使用元类继承方式。
---
## 未来优化建议
-`__metaclass = Singleton` 改为 Python 3 兼容的元类写法。
- 添加 `get()` 方法以安全访问嵌套键(如 `cfg.get('database.host')`)。
- 支持 JSON/YAML 等更安全的配置格式作为替代选项。
- 引入配置验证机制(如基于 schema
- 增加单元测试覆盖。
---
## 版权声明
> 本软件由 longtop Co. 开发,遵循项目 LICENSE 文件中的条款发布。
> 如需商业合作或技术支持请联系作者yumoqing@gmail.com
---
📅 文档最后更新2025-04-05