编码规范¶
CertFlow-PySide6 的编码规范,基于 PEP 8 并扩展项目特定约定。
概述¶
基础规范: 遵循 PEP 8 代码风格
类型注解: 所有函数和方法必须使用类型注解
文档字符串: 使用自定义的中文文档字符串格式
Python版本: Python 3.10+
代码风格¶
缩进与行长度¶
# 使用4个空格缩进,不使用Tab
# 每行最多120个字符
# 长行使用括号进行隐式续行
result = some_function(
arg1="very_long_value",
arg2="another_long_value",
arg3="third_long_value"
)
命名约定¶
类型 |
命名规则 |
示例 |
|---|---|---|
模块/包 |
小写 + 下划线 |
|
类 |
PascalCase |
|
函数/方法 |
小写 + 下划线 |
|
私有方法 |
单下划线前缀 |
|
变量 |
小写 + 下划线 |
|
常量 |
大写 + 下划线 |
|
信号 |
小写 + 下划线 + |
|
导入顺序¶
# 1. 标准库导入
import sys
from pathlib import Path
from typing import Any, Dict, List, Optional
# 2. 第三方库导入
import pandas as pd
from loguru import logger
from PySide6.QtCore import Qt, Signal
from PySide6.QtWidgets import QWidget, QVBoxLayout
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import Session
# 3. 本地模块导入
from certflow.config.settings import APP_NAME
from certflow.models.base import Base
from certflow.utils.database import DatabaseManager
文档字符串规范¶
模块文档字符串¶
"""模块简短描述
模块详细描述,说明功能和主要用途。
可以多行描述。
Examples:
>>> from certflow.services import SalePlanService
>>> service = SalePlanService(session)
>>> result = service.get_all_sale_plans()
"""
类文档字符串¶
class SalePlanService:
"""类简短描述
详细描述类的功能、职责和使用场景。
Attributes:
session: 数据库会话对象
excel_handler: Excel文件处理器实例
Examples:
>>> service = SalePlanService(session)
>>> service.import_from_excel("data.xlsx")
"""
方法文档字符串¶
def generate_certificate_number(
self, sale_plan_id: int, rule_code: str = "certificate"
) -> str:
"""生成合格证编号
根据销售计划ID和编号规则生成唯一的合格证编号。
Args:
sale_plan_id: 销售计划ID
rule_code: 编号规则编码,默认为"certificate"
Returns:
str: 生成的合格证编号
Raises:
ValueError: 当销售计划不存在或规则未启用时抛出
Examples:
>>> service = AutoNumberService(session)
>>> number = service.generate_certificate_number(100)
>>> print(number)
"CF-20241215-0001"
"""
文档字符串格式要点¶
使用三重双引号
"""使用中文编写,但避免使用中文标点符号(使用英文标点)
第一行简要描述,空一行后写详细描述
使用
Args:、Returns:、Raises:、Examples:等标记参数类型和返回值类型已在类型注解中声明,文档中可不重复
类型注解规范¶
基本类型¶
from typing import Any, Dict, List, Optional, Tuple, Union
def process_data(
data: List[Dict[str, Any]], limit: int = 100
) -> Optional[Dict[str, Any]]:
...
使用现代类型语法(Python 3.10+)¶
# 推荐使用
def get_items(ids: list[int]) -> dict[str, Any]:
...
# 而不是
def get_items(ids: List[int]) -> Dict[str, Any]:
...
类型别名¶
# 复杂类型定义别名
Filters = Dict[str, Union[str, int, bool, None]]
ResultDict = Dict[str, Union[bool, str, int, List]]
def search(filters: Filters) -> ResultDict:
...
错误处理¶
异常捕获¶
try:
result = self.session.query(SalePlan).filter_by(id=plan_id).first()
except SQLAlchemyError as e:
logger.error(f"数据库查询失败: {e}")
self.session.rollback()
raise
日志记录¶
# 使用 loguru
from loguru import logger
logger.debug("调试信息")
logger.info("一般信息")
logger.warning("警告信息")
logger.error(f"错误信息: {e}")
Qt 信号与槽¶
信号定义¶
from PySide6.QtCore import QObject, Signal
class CertificateView(QWidget):
# 信号命名使用小写 + 下划线 + _requested/_changed 后缀
print_requested = Signal(list) # 带参数
data_changed = Signal() # 无参数
槽函数命名¶
def on_print_clicked(self) -> None:
"""打印按钮点击槽函数"""
...
def on_filter_changed(self) -> None:
"""筛选条件变化槽函数"""
...
def _do_search(self) -> None:
"""内部槽函数使用下划线前缀"""
...
数据库模型规范¶
模型定义¶
from sqlalchemy import Column, Integer, String
from certflow.models.base import Base
class SalePlan(Base):
"""销售计划模型"""
__tablename__ = "sale_plans"
id = Column(Integer, primary_key=True, autoincrement=True)
product_model = Column(String(200), nullable=False, comment="产品型号")
def __repr__(self) -> str:
return f"<SalePlan(id={self.id}, product={self.product_model})>"
字段注释¶
所有字段必须添加
comment参数关系字段需要说明关联关系
配置文件规范¶
YAML配置注释¶
# 应用配置
app:
name: "CertFlow" # 应用程序名称
version: "2.0.0" # 版本号
debug: false # 调试模式(生产环境设为false)
配置读取¶
# 使用 settings.py 中的常量
from certflow.config.settings import APP_NAME, SORT_KEYS
# 避免直接调用 _cfg()
视图开发规范¶
UI布局¶
def setup_ui(self) -> None:
"""设置界面 - 在构造函数中调用"""
layout = QVBoxLayout(self)
# 按功能分组创建区域
self.setup_filter_section(layout)
self.setup_result_table(layout)
self.setup_button_bar(layout)
信号连接¶
def _connect_signals(self) -> None:
"""连接信号与槽 - 在setup_ui后调用"""
self.search_btn.clicked.connect(self.on_search_clicked)
self.table.itemSelectionChanged.connect(self.on_selection_changed)
提交前检查清单¶
[ ] 代码符合 PEP 8 规范
[ ] 所有函数有类型注解
[ ] 公共类和方法有文档字符串
[ ] 异常有适当的日志记录
[ ] 无硬编码的路径或配置值(使用 settings)
[ ] 数据库会话正确关闭
[ ] Qt对象正确设置父对象(避免内存泄漏)
待补充¶
单元测试规范
代码审查流程
Git提交消息格式
CI/CD配置规范