param-management-client


Nameparam-management-client JSON
Version 2.0.1 PyPI version JSON
download
home_pagehttps://github.com/yourusername/param-management-client
Summary参数管理系统 Python 客户端,支持类似pandas DataFrame的点号访问方式,内置完整后端服务
upload_time2025-10-18 09:03:14
maintainerNone
docs_urlNone
authorYour Name
requires_python>=3.7
licenseMIT
keywords parameter management optimization pyomo pandas-like dot notation fastapi backend embedded server database
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 参数管理系统 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"
}
        
Elapsed time: 1.57170s