# 参数管理系统 Python 客户端
一个支持类似pandas DataFrame点号访问方式的Python客户端,专门为参数管理系统设计。**v2.0.0版本新增内置完整后端服务功能!**
## 主要特性
🎯 **点号访问**: 支持 `project.category_name.parameter_name` 的直观访问方式
📊 **属性丰富**: 每个参数都包含值、单位、描述、类型等完整信息
🔄 **类型安全**: 自动处理各种参数类型(数值、列表、布尔值等)
📝 **元数据完整**: 支持访问参数和分类的所有元数据信息
🐍 **Pythonic**: 完全符合Python编程习惯,支持迭代、索引等操作
🔧 **Pyomo集成**: 完美支持在Pyomo优化建模中使用
🚀 **内置后端**: 新版本内置完整的FastAPI后端服务,无需单独部署
💾 **数据库支持**: 内置SQLite数据库,支持完整的CRUD操作
📤 **导入导出**: 支持Excel、JSON、文本等多种格式的参数导入导出
🔐 **用户认证**: 支持JWT用户认证和权限管理
## 安装
```bash
pip install param-management-client
```
## 快速开始
### 方式1: 使用内置后端服务(推荐)
```python
from param_management_client import ParameterClient, run_embedded_server
import threading
import time
# 启动内置后端服务
def start_server():
run_embedded_server(host="127.0.0.1", port=8000)
# 在后台线程启动服务器
server_thread = threading.Thread(target=start_server, daemon=True)
server_thread.start()
time.sleep(2) # 等待服务器启动
# 创建客户端并加载项目
client = ParameterClient(
host="127.0.0.1",
port=8000,
project_name="energy_optimization_params"
)
# 获取项目对象
project = client.get_project()
```
### 方式2: 连接远程服务器
```python
from param_management_client import ParameterClient
# 创建客户端并加载项目
client = ParameterClient(
host="localhost",
port=8000,
project_name="energy_optimization_params"
)
# 获取项目对象
project = client.get_project()
# 访问项目基本信息
print(f"项目名称: {project.name}")
print(f"项目英文名: {project.name_en}")
print(f"时间范围: {project.time_horizon} 年")
print(f"参数分类: {project.categories}")
```
### 分类访问
```python
# 通过点号访问分类
wind_params = project.wind_params
print(f"分类名称: {wind_params.name}")
print(f"分类描述: {wind_params.description}")
print(f"参数列表: {wind_params.list_parameters()}")
```
### 参数访问
```python
# 访问单个参数
capital_ratio = project.wind_params.capital_ratio
print(f"参数值: {capital_ratio.value}")
print(f"参数单位: {capital_ratio.unit}")
print(f"参数描述: {capital_ratio.description}")
print(f"参数类型: {capital_ratio.param_type}")
# 访问列表参数
electricity_price = project.wind_params.electricity_price
print(f"列表长度: {len(electricity_price)}")
print(f"第一年电价: {electricity_price[0]}")
print(f"最后一年电价: {electricity_price[-1]}")
# 遍历列表参数
for i, price in enumerate(electricity_price):
year = project.start_year + i * project.year_step
print(f"{year}年电价: {price}")
```
### 在Pyomo中使用
```python
import pyomo.environ as pyo
# 创建Pyomo模型
model = pyo.ConcreteModel()
model.T = pyo.Set(initialize=range(project.time_horizon))
# 从参数系统获取数据(自动类型转换)
wind_capital_ratio = project.wind_params.capital_ratio.value
wind_unit_cost = project.wind_params.unit_investment_cost.value
wind_electricity_price = project.wind_params.electricity_price.value
# 定义Pyomo参数
model.wind_capital_ratio = pyo.Param(initialize=wind_capital_ratio)
model.wind_unit_cost = pyo.Param(initialize=wind_unit_cost)
model.electricity_price = pyo.Param(
model.T,
initialize=lambda m, t: wind_electricity_price[t] if t < len(wind_electricity_price) else 0
)
# 定义决策变量和目标函数
model.wind_capacity = pyo.Var(model.T, domain=pyo.NonNegativeReals)
model.objective = pyo.Objective(
expr=sum(model.wind_unit_cost * model.wind_capacity[t] * model.wind_capital_ratio for t in model.T),
sense=pyo.minimize
)
```
## API 参考
### ParameterClient 类
#### 构造函数
```python
ParameterClient(host="localhost", port=8000, project_name=None)
```
**参数:**
- `host` (str): 服务器地址
- `port` (int): 服务器端口,默认8000
- `project_name` (str, 可选): 项目英文名称
#### 主要方法
##### `load_project(project_name=None)`
加载项目数据
**参数:**
- `project_name` (str, 可选): 项目英文名称
**返回:**
- `Project`: 项目对象
##### `get_project()`
获取项目对象
**返回:**
- `Project`: 项目对象
##### `refresh_project()`
刷新项目数据
**返回:**
- `Project`: 更新后的项目对象
### Project 类
#### 属性
- `name`: 项目中文名称
- `name_en`: 项目英文名称
- `description`: 项目描述
- `time_horizon`: 时间长度
- `start_year`: 起始年份
- `year_step`: 年份步长
- `end_year`: 结束年份
- `categories`: 参数分类列表
#### 方法
##### `get_category(name)`
获取指定分类
**参数:**
- `name` (str): 分类英文名称
**返回:**
- `ParameterCategory`: 分类对象
##### `list_categories()`
列出所有分类名称
**返回:**
- `list`: 分类名称列表
### ParameterCategory 类
#### 属性
- `name`: 分类中文名称
- `name_en`: 分类英文名称
- `description`: 分类描述
- `id`: 分类ID
#### 方法
##### `get_parameter(name)`
获取指定参数
**参数:**
- `name` (str): 参数英文名称
**返回:**
- `ParameterValue`: 参数值对象
##### `list_parameters()`
列出所有参数名称
**返回:**
- `list`: 参数名称列表
### ParameterValue 类
#### 属性
- `value`: 参数值
- `unit`: 参数单位
- `description`: 参数描述
- `name`: 参数中文名称
- `name_en`: 参数英文名称
- `param_type`: 参数类型
- `is_list`: 是否为列表参数
- `is_year_related`: 是否关联年份
- `list_length`: 列表长度
#### 方法
##### `__getitem__(index)`
支持列表索引访问
##### `__len__()`
支持len()函数
##### `__iter__()`
支持迭代
## 使用示例
### 示例1: 基本参数访问
```python
from param_management_client import ParameterClient
# 创建客户端
client = ParameterClient(
host="localhost",
port=8000,
project_name="energy_optimization_params"
)
project = client.get_project()
# 访问项目信息
print(f"项目: {project.name} ({project.name_en})")
print(f"时间范围: {project.time_horizon} 年")
print(f"分类: {project.categories}")
# 访问风能参数
wind_params = project.wind_params
print(f"风能参数: {wind_params.name}")
print(f"参数列表: {wind_params.list_parameters()}")
# 访问具体参数
capital_ratio = wind_params.capital_ratio
print(f"资本比例: {capital_ratio.value} {capital_ratio.unit}")
print(f"描述: {capital_ratio.description}")
```
### 示例2: 列表参数操作
```python
# 获取电价列表
electricity_price = project.wind_params.electricity_price
# 基本操作
print(f"电价列表长度: {len(electricity_price)}")
print(f"第一年电价: {electricity_price[0]}")
print(f"最后一年电价: {electricity_price[-1]}")
# 遍历列表
for i, price in enumerate(electricity_price):
year = project.start_year + i * project.year_step
print(f"{year}年电价: {price}")
# 切片操作
first_5_years = [electricity_price[i] for i in range(5)]
print(f"前5年电价: {first_5_years}")
```
### 示例3: 参数验证
```python
def validate_parameters(project):
"""验证参数完整性"""
# 检查必需分类
required_categories = ["wind_params", "pv_params", "storage_params"]
missing = [cat for cat in required_categories if cat not in project.categories]
if missing:
print(f"❌ 缺少必需分类: {missing}")
return False
# 检查参数类型
for category_name in project.categories:
category = getattr(project, category_name)
print(f"\n分类: {category.name_en}")
for param_name in category.list_parameters():
param = getattr(category, param_name)
print(f" {param.name_en}: {param.param_type} {'(列表)' if param.is_list else ''}")
return True
# 使用验证函数
validate_parameters(project)
```
## 错误处理
### 常见错误类型
1. **AttributeError**: 访问不存在的分类或参数
2. **TypeError**: 对非列表参数使用索引访问
3. **KeyError**: 使用get_category()或get_parameter()访问不存在的项目
4. **ValueError**: 项目未加载时调用get_project()
### 错误处理示例
```python
try:
client = ParameterClient(
host="localhost",
port=8000,
project_name="energy_optimization_params"
)
project = client.get_project()
# 尝试访问不存在的分类
try:
nonexistent_category = project.nonexistent_category
except AttributeError as e:
print(f"分类不存在: {e}")
# 尝试访问不存在的参数
try:
nonexistent_param = project.wind_params.nonexistent_param
except AttributeError as e:
print(f"参数不存在: {e}")
# 尝试对非列表参数使用索引
try:
capital_ratio = project.wind_params.capital_ratio
value = capital_ratio[0] # 这应该会失败
except TypeError as e:
print(f"非列表参数不能使用索引: {e}")
except Exception as e:
print(f"客户端错误: {e}")
```
## 开发
### 安装开发依赖
```bash
pip install -e ".[dev]"
```
### 运行测试
```bash
pytest
```
### 代码格式化
```bash
black param_management_client/
```
### 类型检查
```bash
mypy param_management_client/
```
## 许可证
本项目使用 MIT 许可证。
## 更新日志
- **v2.0.0**: 重大更新,新增内置后端服务功能
- 🚀 内置完整的FastAPI后端服务,无需单独部署
- 💾 内置SQLite数据库支持
- 📤 支持Excel、JSON、文本等多种格式的参数导入导出
- 🔐 支持JWT用户认证和权限管理
- 🛠️ 完整的CRUD API接口
- 📊 支持参数一致性验证
- 🔄 支持项目备份和恢复功能
- **v1.0.0**: 初始版本,支持点号访问功能
- 支持完整的参数元数据访问
- 支持列表参数操作
- 完善的错误处理机制
- 支持Pyomo集成
Raw data
{
"_id": null,
"home_page": "https://github.com/yourusername/param-management-client",
"name": "param-management-client",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "parameter, management, optimization, pyomo, pandas-like, dot notation, fastapi, backend, embedded server, database",
"author": "Your Name",
"author_email": "Your Name <your.email@example.com>",
"download_url": "https://files.pythonhosted.org/packages/4c/a0/27f02fd6fa9fbde7302dced8dae9b0fdd4a66edd1ad88331742b4b7e0a01/param-management-client-2.0.1.tar.gz",
"platform": null,
"description": "# \u53c2\u6570\u7ba1\u7406\u7cfb\u7edf Python \u5ba2\u6237\u7aef\n\n\u4e00\u4e2a\u652f\u6301\u7c7b\u4f3cpandas DataFrame\u70b9\u53f7\u8bbf\u95ee\u65b9\u5f0f\u7684Python\u5ba2\u6237\u7aef\uff0c\u4e13\u95e8\u4e3a\u53c2\u6570\u7ba1\u7406\u7cfb\u7edf\u8bbe\u8ba1\u3002**v2.0.0\u7248\u672c\u65b0\u589e\u5185\u7f6e\u5b8c\u6574\u540e\u7aef\u670d\u52a1\u529f\u80fd\uff01**\n\n## \u4e3b\u8981\u7279\u6027\n\n\ud83c\udfaf **\u70b9\u53f7\u8bbf\u95ee**: \u652f\u6301 `project.category_name.parameter_name` \u7684\u76f4\u89c2\u8bbf\u95ee\u65b9\u5f0f\n\ud83d\udcca **\u5c5e\u6027\u4e30\u5bcc**: \u6bcf\u4e2a\u53c2\u6570\u90fd\u5305\u542b\u503c\u3001\u5355\u4f4d\u3001\u63cf\u8ff0\u3001\u7c7b\u578b\u7b49\u5b8c\u6574\u4fe1\u606f\n\ud83d\udd04 **\u7c7b\u578b\u5b89\u5168**: \u81ea\u52a8\u5904\u7406\u5404\u79cd\u53c2\u6570\u7c7b\u578b\uff08\u6570\u503c\u3001\u5217\u8868\u3001\u5e03\u5c14\u503c\u7b49\uff09\n\ud83d\udcdd **\u5143\u6570\u636e\u5b8c\u6574**: \u652f\u6301\u8bbf\u95ee\u53c2\u6570\u548c\u5206\u7c7b\u7684\u6240\u6709\u5143\u6570\u636e\u4fe1\u606f\n\ud83d\udc0d **Pythonic**: \u5b8c\u5168\u7b26\u5408Python\u7f16\u7a0b\u4e60\u60ef\uff0c\u652f\u6301\u8fed\u4ee3\u3001\u7d22\u5f15\u7b49\u64cd\u4f5c\n\ud83d\udd27 **Pyomo\u96c6\u6210**: \u5b8c\u7f8e\u652f\u6301\u5728Pyomo\u4f18\u5316\u5efa\u6a21\u4e2d\u4f7f\u7528\n\ud83d\ude80 **\u5185\u7f6e\u540e\u7aef**: \u65b0\u7248\u672c\u5185\u7f6e\u5b8c\u6574\u7684FastAPI\u540e\u7aef\u670d\u52a1\uff0c\u65e0\u9700\u5355\u72ec\u90e8\u7f72\n\ud83d\udcbe **\u6570\u636e\u5e93\u652f\u6301**: \u5185\u7f6eSQLite\u6570\u636e\u5e93\uff0c\u652f\u6301\u5b8c\u6574\u7684CRUD\u64cd\u4f5c\n\ud83d\udce4 **\u5bfc\u5165\u5bfc\u51fa**: \u652f\u6301Excel\u3001JSON\u3001\u6587\u672c\u7b49\u591a\u79cd\u683c\u5f0f\u7684\u53c2\u6570\u5bfc\u5165\u5bfc\u51fa\n\ud83d\udd10 **\u7528\u6237\u8ba4\u8bc1**: \u652f\u6301JWT\u7528\u6237\u8ba4\u8bc1\u548c\u6743\u9650\u7ba1\u7406\n\n## \u5b89\u88c5\n\n```bash\npip install param-management-client\n```\n\n## \u5feb\u901f\u5f00\u59cb\n\n### \u65b9\u5f0f1: \u4f7f\u7528\u5185\u7f6e\u540e\u7aef\u670d\u52a1\uff08\u63a8\u8350\uff09\n\n```python\nfrom param_management_client import ParameterClient, run_embedded_server\nimport threading\nimport time\n\n# \u542f\u52a8\u5185\u7f6e\u540e\u7aef\u670d\u52a1\ndef start_server():\n run_embedded_server(host=\"127.0.0.1\", port=8000)\n\n# \u5728\u540e\u53f0\u7ebf\u7a0b\u542f\u52a8\u670d\u52a1\u5668\nserver_thread = threading.Thread(target=start_server, daemon=True)\nserver_thread.start()\ntime.sleep(2) # \u7b49\u5f85\u670d\u52a1\u5668\u542f\u52a8\n\n# \u521b\u5efa\u5ba2\u6237\u7aef\u5e76\u52a0\u8f7d\u9879\u76ee\nclient = ParameterClient(\n host=\"127.0.0.1\",\n port=8000,\n project_name=\"energy_optimization_params\"\n)\n\n# \u83b7\u53d6\u9879\u76ee\u5bf9\u8c61\nproject = client.get_project()\n```\n\n### \u65b9\u5f0f2: \u8fde\u63a5\u8fdc\u7a0b\u670d\u52a1\u5668\n\n```python\nfrom param_management_client import ParameterClient\n\n# \u521b\u5efa\u5ba2\u6237\u7aef\u5e76\u52a0\u8f7d\u9879\u76ee\nclient = ParameterClient(\n host=\"localhost\",\n port=8000,\n project_name=\"energy_optimization_params\"\n)\n\n# \u83b7\u53d6\u9879\u76ee\u5bf9\u8c61\nproject = client.get_project()\n\n# \u8bbf\u95ee\u9879\u76ee\u57fa\u672c\u4fe1\u606f\nprint(f\"\u9879\u76ee\u540d\u79f0: {project.name}\")\nprint(f\"\u9879\u76ee\u82f1\u6587\u540d: {project.name_en}\")\nprint(f\"\u65f6\u95f4\u8303\u56f4: {project.time_horizon} \u5e74\")\nprint(f\"\u53c2\u6570\u5206\u7c7b: {project.categories}\")\n```\n\n### \u5206\u7c7b\u8bbf\u95ee\n\n```python\n# \u901a\u8fc7\u70b9\u53f7\u8bbf\u95ee\u5206\u7c7b\nwind_params = project.wind_params\nprint(f\"\u5206\u7c7b\u540d\u79f0: {wind_params.name}\")\nprint(f\"\u5206\u7c7b\u63cf\u8ff0: {wind_params.description}\")\nprint(f\"\u53c2\u6570\u5217\u8868: {wind_params.list_parameters()}\")\n```\n\n### \u53c2\u6570\u8bbf\u95ee\n\n```python\n# \u8bbf\u95ee\u5355\u4e2a\u53c2\u6570\ncapital_ratio = project.wind_params.capital_ratio\nprint(f\"\u53c2\u6570\u503c: {capital_ratio.value}\")\nprint(f\"\u53c2\u6570\u5355\u4f4d: {capital_ratio.unit}\")\nprint(f\"\u53c2\u6570\u63cf\u8ff0: {capital_ratio.description}\")\nprint(f\"\u53c2\u6570\u7c7b\u578b: {capital_ratio.param_type}\")\n\n# \u8bbf\u95ee\u5217\u8868\u53c2\u6570\nelectricity_price = project.wind_params.electricity_price\nprint(f\"\u5217\u8868\u957f\u5ea6: {len(electricity_price)}\")\nprint(f\"\u7b2c\u4e00\u5e74\u7535\u4ef7: {electricity_price[0]}\")\nprint(f\"\u6700\u540e\u4e00\u5e74\u7535\u4ef7: {electricity_price[-1]}\")\n\n# \u904d\u5386\u5217\u8868\u53c2\u6570\nfor i, price in enumerate(electricity_price):\n year = project.start_year + i * project.year_step\n print(f\"{year}\u5e74\u7535\u4ef7: {price}\")\n```\n\n### \u5728Pyomo\u4e2d\u4f7f\u7528\n\n```python\nimport pyomo.environ as pyo\n\n# \u521b\u5efaPyomo\u6a21\u578b\nmodel = pyo.ConcreteModel()\nmodel.T = pyo.Set(initialize=range(project.time_horizon))\n\n# \u4ece\u53c2\u6570\u7cfb\u7edf\u83b7\u53d6\u6570\u636e\uff08\u81ea\u52a8\u7c7b\u578b\u8f6c\u6362\uff09\nwind_capital_ratio = project.wind_params.capital_ratio.value\nwind_unit_cost = project.wind_params.unit_investment_cost.value\nwind_electricity_price = project.wind_params.electricity_price.value\n\n# \u5b9a\u4e49Pyomo\u53c2\u6570\nmodel.wind_capital_ratio = pyo.Param(initialize=wind_capital_ratio)\nmodel.wind_unit_cost = pyo.Param(initialize=wind_unit_cost)\nmodel.electricity_price = pyo.Param(\n model.T, \n initialize=lambda m, t: wind_electricity_price[t] if t < len(wind_electricity_price) else 0\n)\n\n# \u5b9a\u4e49\u51b3\u7b56\u53d8\u91cf\u548c\u76ee\u6807\u51fd\u6570\nmodel.wind_capacity = pyo.Var(model.T, domain=pyo.NonNegativeReals)\nmodel.objective = pyo.Objective(\n expr=sum(model.wind_unit_cost * model.wind_capacity[t] * model.wind_capital_ratio for t in model.T),\n sense=pyo.minimize\n)\n```\n\n## API \u53c2\u8003\n\n### ParameterClient \u7c7b\n\n#### \u6784\u9020\u51fd\u6570\n\n```python\nParameterClient(host=\"localhost\", port=8000, project_name=None)\n```\n\n**\u53c2\u6570:**\n- `host` (str): \u670d\u52a1\u5668\u5730\u5740\n- `port` (int): \u670d\u52a1\u5668\u7aef\u53e3\uff0c\u9ed8\u8ba48000\n- `project_name` (str, \u53ef\u9009): \u9879\u76ee\u82f1\u6587\u540d\u79f0\n\n#### \u4e3b\u8981\u65b9\u6cd5\n\n##### `load_project(project_name=None)`\n\u52a0\u8f7d\u9879\u76ee\u6570\u636e\n\n**\u53c2\u6570:**\n- `project_name` (str, \u53ef\u9009): \u9879\u76ee\u82f1\u6587\u540d\u79f0\n\n**\u8fd4\u56de:**\n- `Project`: \u9879\u76ee\u5bf9\u8c61\n\n##### `get_project()`\n\u83b7\u53d6\u9879\u76ee\u5bf9\u8c61\n\n**\u8fd4\u56de:**\n- `Project`: \u9879\u76ee\u5bf9\u8c61\n\n##### `refresh_project()`\n\u5237\u65b0\u9879\u76ee\u6570\u636e\n\n**\u8fd4\u56de:**\n- `Project`: \u66f4\u65b0\u540e\u7684\u9879\u76ee\u5bf9\u8c61\n\n### Project \u7c7b\n\n#### \u5c5e\u6027\n\n- `name`: \u9879\u76ee\u4e2d\u6587\u540d\u79f0\n- `name_en`: \u9879\u76ee\u82f1\u6587\u540d\u79f0\n- `description`: \u9879\u76ee\u63cf\u8ff0\n- `time_horizon`: \u65f6\u95f4\u957f\u5ea6\n- `start_year`: \u8d77\u59cb\u5e74\u4efd\n- `year_step`: \u5e74\u4efd\u6b65\u957f\n- `end_year`: \u7ed3\u675f\u5e74\u4efd\n- `categories`: \u53c2\u6570\u5206\u7c7b\u5217\u8868\n\n#### \u65b9\u6cd5\n\n##### `get_category(name)`\n\u83b7\u53d6\u6307\u5b9a\u5206\u7c7b\n\n**\u53c2\u6570:**\n- `name` (str): \u5206\u7c7b\u82f1\u6587\u540d\u79f0\n\n**\u8fd4\u56de:**\n- `ParameterCategory`: \u5206\u7c7b\u5bf9\u8c61\n\n##### `list_categories()`\n\u5217\u51fa\u6240\u6709\u5206\u7c7b\u540d\u79f0\n\n**\u8fd4\u56de:**\n- `list`: \u5206\u7c7b\u540d\u79f0\u5217\u8868\n\n### ParameterCategory \u7c7b\n\n#### \u5c5e\u6027\n\n- `name`: \u5206\u7c7b\u4e2d\u6587\u540d\u79f0\n- `name_en`: \u5206\u7c7b\u82f1\u6587\u540d\u79f0\n- `description`: \u5206\u7c7b\u63cf\u8ff0\n- `id`: \u5206\u7c7bID\n\n#### \u65b9\u6cd5\n\n##### `get_parameter(name)`\n\u83b7\u53d6\u6307\u5b9a\u53c2\u6570\n\n**\u53c2\u6570:**\n- `name` (str): \u53c2\u6570\u82f1\u6587\u540d\u79f0\n\n**\u8fd4\u56de:**\n- `ParameterValue`: \u53c2\u6570\u503c\u5bf9\u8c61\n\n##### `list_parameters()`\n\u5217\u51fa\u6240\u6709\u53c2\u6570\u540d\u79f0\n\n**\u8fd4\u56de:**\n- `list`: \u53c2\u6570\u540d\u79f0\u5217\u8868\n\n### ParameterValue \u7c7b\n\n#### \u5c5e\u6027\n\n- `value`: \u53c2\u6570\u503c\n- `unit`: \u53c2\u6570\u5355\u4f4d\n- `description`: \u53c2\u6570\u63cf\u8ff0\n- `name`: \u53c2\u6570\u4e2d\u6587\u540d\u79f0\n- `name_en`: \u53c2\u6570\u82f1\u6587\u540d\u79f0\n- `param_type`: \u53c2\u6570\u7c7b\u578b\n- `is_list`: \u662f\u5426\u4e3a\u5217\u8868\u53c2\u6570\n- `is_year_related`: \u662f\u5426\u5173\u8054\u5e74\u4efd\n- `list_length`: \u5217\u8868\u957f\u5ea6\n\n#### \u65b9\u6cd5\n\n##### `__getitem__(index)`\n\u652f\u6301\u5217\u8868\u7d22\u5f15\u8bbf\u95ee\n\n##### `__len__()`\n\u652f\u6301len()\u51fd\u6570\n\n##### `__iter__()`\n\u652f\u6301\u8fed\u4ee3\n\n## \u4f7f\u7528\u793a\u4f8b\n\n### \u793a\u4f8b1: \u57fa\u672c\u53c2\u6570\u8bbf\u95ee\n\n```python\nfrom param_management_client import ParameterClient\n\n# \u521b\u5efa\u5ba2\u6237\u7aef\nclient = ParameterClient(\n host=\"localhost\",\n port=8000,\n project_name=\"energy_optimization_params\"\n)\n\nproject = client.get_project()\n\n# \u8bbf\u95ee\u9879\u76ee\u4fe1\u606f\nprint(f\"\u9879\u76ee: {project.name} ({project.name_en})\")\nprint(f\"\u65f6\u95f4\u8303\u56f4: {project.time_horizon} \u5e74\")\nprint(f\"\u5206\u7c7b: {project.categories}\")\n\n# \u8bbf\u95ee\u98ce\u80fd\u53c2\u6570\nwind_params = project.wind_params\nprint(f\"\u98ce\u80fd\u53c2\u6570: {wind_params.name}\")\nprint(f\"\u53c2\u6570\u5217\u8868: {wind_params.list_parameters()}\")\n\n# \u8bbf\u95ee\u5177\u4f53\u53c2\u6570\ncapital_ratio = wind_params.capital_ratio\nprint(f\"\u8d44\u672c\u6bd4\u4f8b: {capital_ratio.value} {capital_ratio.unit}\")\nprint(f\"\u63cf\u8ff0: {capital_ratio.description}\")\n```\n\n### \u793a\u4f8b2: \u5217\u8868\u53c2\u6570\u64cd\u4f5c\n\n```python\n# \u83b7\u53d6\u7535\u4ef7\u5217\u8868\nelectricity_price = project.wind_params.electricity_price\n\n# \u57fa\u672c\u64cd\u4f5c\nprint(f\"\u7535\u4ef7\u5217\u8868\u957f\u5ea6: {len(electricity_price)}\")\nprint(f\"\u7b2c\u4e00\u5e74\u7535\u4ef7: {electricity_price[0]}\")\nprint(f\"\u6700\u540e\u4e00\u5e74\u7535\u4ef7: {electricity_price[-1]}\")\n\n# \u904d\u5386\u5217\u8868\nfor i, price in enumerate(electricity_price):\n year = project.start_year + i * project.year_step\n print(f\"{year}\u5e74\u7535\u4ef7: {price}\")\n\n# \u5207\u7247\u64cd\u4f5c\nfirst_5_years = [electricity_price[i] for i in range(5)]\nprint(f\"\u524d5\u5e74\u7535\u4ef7: {first_5_years}\")\n```\n\n### \u793a\u4f8b3: \u53c2\u6570\u9a8c\u8bc1\n\n```python\ndef validate_parameters(project):\n \"\"\"\u9a8c\u8bc1\u53c2\u6570\u5b8c\u6574\u6027\"\"\"\n \n # \u68c0\u67e5\u5fc5\u9700\u5206\u7c7b\n required_categories = [\"wind_params\", \"pv_params\", \"storage_params\"]\n missing = [cat for cat in required_categories if cat not in project.categories]\n \n if missing:\n print(f\"\u274c \u7f3a\u5c11\u5fc5\u9700\u5206\u7c7b: {missing}\")\n return False\n \n # \u68c0\u67e5\u53c2\u6570\u7c7b\u578b\n for category_name in project.categories:\n category = getattr(project, category_name)\n print(f\"\\n\u5206\u7c7b: {category.name_en}\")\n \n for param_name in category.list_parameters():\n param = getattr(category, param_name)\n print(f\" {param.name_en}: {param.param_type} {'(\u5217\u8868)' if param.is_list else ''}\")\n \n return True\n\n# \u4f7f\u7528\u9a8c\u8bc1\u51fd\u6570\nvalidate_parameters(project)\n```\n\n## \u9519\u8bef\u5904\u7406\n\n### \u5e38\u89c1\u9519\u8bef\u7c7b\u578b\n\n1. **AttributeError**: \u8bbf\u95ee\u4e0d\u5b58\u5728\u7684\u5206\u7c7b\u6216\u53c2\u6570\n2. **TypeError**: \u5bf9\u975e\u5217\u8868\u53c2\u6570\u4f7f\u7528\u7d22\u5f15\u8bbf\u95ee\n3. **KeyError**: \u4f7f\u7528get_category()\u6216get_parameter()\u8bbf\u95ee\u4e0d\u5b58\u5728\u7684\u9879\u76ee\n4. **ValueError**: \u9879\u76ee\u672a\u52a0\u8f7d\u65f6\u8c03\u7528get_project()\n\n### \u9519\u8bef\u5904\u7406\u793a\u4f8b\n\n```python\ntry:\n client = ParameterClient(\n host=\"localhost\",\n port=8000,\n project_name=\"energy_optimization_params\"\n )\n project = client.get_project()\n \n # \u5c1d\u8bd5\u8bbf\u95ee\u4e0d\u5b58\u5728\u7684\u5206\u7c7b\n try:\n nonexistent_category = project.nonexistent_category\n except AttributeError as e:\n print(f\"\u5206\u7c7b\u4e0d\u5b58\u5728: {e}\")\n \n # \u5c1d\u8bd5\u8bbf\u95ee\u4e0d\u5b58\u5728\u7684\u53c2\u6570\n try:\n nonexistent_param = project.wind_params.nonexistent_param\n except AttributeError as e:\n print(f\"\u53c2\u6570\u4e0d\u5b58\u5728: {e}\")\n \n # \u5c1d\u8bd5\u5bf9\u975e\u5217\u8868\u53c2\u6570\u4f7f\u7528\u7d22\u5f15\n try:\n capital_ratio = project.wind_params.capital_ratio\n value = capital_ratio[0] # \u8fd9\u5e94\u8be5\u4f1a\u5931\u8d25\n except TypeError as e:\n print(f\"\u975e\u5217\u8868\u53c2\u6570\u4e0d\u80fd\u4f7f\u7528\u7d22\u5f15: {e}\")\n \nexcept Exception as e:\n print(f\"\u5ba2\u6237\u7aef\u9519\u8bef: {e}\")\n```\n\n## \u5f00\u53d1\n\n### \u5b89\u88c5\u5f00\u53d1\u4f9d\u8d56\n\n```bash\npip install -e \".[dev]\"\n```\n\n### \u8fd0\u884c\u6d4b\u8bd5\n\n```bash\npytest\n```\n\n### \u4ee3\u7801\u683c\u5f0f\u5316\n\n```bash\nblack param_management_client/\n```\n\n### \u7c7b\u578b\u68c0\u67e5\n\n```bash\nmypy param_management_client/\n```\n\n## \u8bb8\u53ef\u8bc1\n\n\u672c\u9879\u76ee\u4f7f\u7528 MIT \u8bb8\u53ef\u8bc1\u3002\n\n## \u66f4\u65b0\u65e5\u5fd7\n\n- **v2.0.0**: \u91cd\u5927\u66f4\u65b0\uff0c\u65b0\u589e\u5185\u7f6e\u540e\u7aef\u670d\u52a1\u529f\u80fd\n - \ud83d\ude80 \u5185\u7f6e\u5b8c\u6574\u7684FastAPI\u540e\u7aef\u670d\u52a1\uff0c\u65e0\u9700\u5355\u72ec\u90e8\u7f72\n - \ud83d\udcbe \u5185\u7f6eSQLite\u6570\u636e\u5e93\u652f\u6301\n - \ud83d\udce4 \u652f\u6301Excel\u3001JSON\u3001\u6587\u672c\u7b49\u591a\u79cd\u683c\u5f0f\u7684\u53c2\u6570\u5bfc\u5165\u5bfc\u51fa\n - \ud83d\udd10 \u652f\u6301JWT\u7528\u6237\u8ba4\u8bc1\u548c\u6743\u9650\u7ba1\u7406\n - \ud83d\udee0\ufe0f \u5b8c\u6574\u7684CRUD API\u63a5\u53e3\n - \ud83d\udcca \u652f\u6301\u53c2\u6570\u4e00\u81f4\u6027\u9a8c\u8bc1\n - \ud83d\udd04 \u652f\u6301\u9879\u76ee\u5907\u4efd\u548c\u6062\u590d\u529f\u80fd\n- **v1.0.0**: \u521d\u59cb\u7248\u672c\uff0c\u652f\u6301\u70b9\u53f7\u8bbf\u95ee\u529f\u80fd\n - \u652f\u6301\u5b8c\u6574\u7684\u53c2\u6570\u5143\u6570\u636e\u8bbf\u95ee\n - \u652f\u6301\u5217\u8868\u53c2\u6570\u64cd\u4f5c\n - \u5b8c\u5584\u7684\u9519\u8bef\u5904\u7406\u673a\u5236\n - \u652f\u6301Pyomo\u96c6\u6210\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "\u53c2\u6570\u7ba1\u7406\u7cfb\u7edf Python \u5ba2\u6237\u7aef\uff0c\u652f\u6301\u7c7b\u4f3cpandas DataFrame\u7684\u70b9\u53f7\u8bbf\u95ee\u65b9\u5f0f\uff0c\u5185\u7f6e\u5b8c\u6574\u540e\u7aef\u670d\u52a1",
"version": "2.0.1",
"project_urls": {
"Bug Tracker": "https://github.com/yourusername/param-management-client/issues",
"Documentation": "https://github.com/yourusername/param-management-client#readme",
"Homepage": "https://github.com/yourusername/param-management-client",
"Repository": "https://github.com/yourusername/param-management-client"
},
"split_keywords": [
"parameter",
" management",
" optimization",
" pyomo",
" pandas-like",
" dot notation",
" fastapi",
" backend",
" embedded server",
" database"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "f733cc2d9c9a69569fbd0dac50588efc45567d46795427c023594ab2a4d1a9d9",
"md5": "337d5f44b7547eec356f1e1ef32aaf62",
"sha256": "5111badb691576d9a9194991718b7685d1a31e5ef6a3734b7317adae5a24be20"
},
"downloads": -1,
"filename": "param_management_client-2.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "337d5f44b7547eec356f1e1ef32aaf62",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 58626,
"upload_time": "2025-10-18T09:03:13",
"upload_time_iso_8601": "2025-10-18T09:03:13.439656Z",
"url": "https://files.pythonhosted.org/packages/f7/33/cc2d9c9a69569fbd0dac50588efc45567d46795427c023594ab2a4d1a9d9/param_management_client-2.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4ca027f02fd6fa9fbde7302dced8dae9b0fdd4a66edd1ad88331742b4b7e0a01",
"md5": "33d530da814f1b84bb1d3f2bfec7a973",
"sha256": "0d66648b851f88947d2e101e689a7ee97c678547b120f57b0a83bddb75946708"
},
"downloads": -1,
"filename": "param-management-client-2.0.1.tar.gz",
"has_sig": false,
"md5_digest": "33d530da814f1b84bb1d3f2bfec7a973",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 55812,
"upload_time": "2025-10-18T09:03:14",
"upload_time_iso_8601": "2025-10-18T09:03:14.743508Z",
"url": "https://files.pythonhosted.org/packages/4c/a0/27f02fd6fa9fbde7302dced8dae9b0fdd4a66edd1ad88331742b4b7e0a01/param-management-client-2.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-18 09:03:14",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "yourusername",
"github_project": "param-management-client",
"github_not_found": true,
"lcname": "param-management-client"
}