Backtrader 代码质量指南

快速开始

安装工具

pip install pyupgrade ruff black pre-commit

```bash

### 运行优化

```bash

# 方法 1: 使用提供的脚本

bash optimize_code.sh

# 方法 2: 手动运行

python -m pyupgrade --py311-plus backtrader/**/*.py
python -m ruff format backtrader/ --line-length 100
python -m ruff check backtrader/ --fix

```bash

### 设置 Pre-commit 钩子

```bash
pre-commit install
pre-commit run --all-files

```bash

## 代码风格规范

### 1. 行长限制

- **最大行长**: 100 字符
- **例外**:  URL、导入语句可以超过限制

```python

# ✅ 好的

result = some_function(arg1, arg2, arg3,
                       arg4, arg5)

# ❌ 不好的

result = some_function(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10)

```bash

### 2. 导入语句

```python

# ✅ 好的

import os
import sys
from typing import Dict, List

import numpy as np
import pandas as pd

from backtrader import Indicator
from backtrader.utils import date2num

# ❌ 不好的

from backtrader import *
import backtrader as bt
from . import *

```bash

### 3. 变量命名

```python

# ✅ 好的

for line in lines:
    process(line)

counter = 0
result_list = []

# ❌ 不好的

for l in lines:  # 容易与 1 混淆
    process(l)

c = 0  # 不清楚含义

res = []  # 缩写不清楚

```bash

### 4. 异常处理

```python

# ✅ 好的

try:
    result = risky_operation()
except ValueError as e:
    logger.error(f"Invalid value: {e}")
except Exception:
    logger.error("Unknown error occurred")

# ❌ 不好的

try:
    result = risky_operation()
except:  # 捕获所有异常,不推荐
    pass

```bash

### 5. 字符串

```python

# ✅ 好的(使用双引号)

message = "Hello, world!"
formatted = f"Value: {value}"

# ❌ 不好的(混合使用)

message = 'Hello, world!'
formatted = 'Value: {}'.format(value)

```bash

### 6. 注释

```python

# ✅ 好的

# 计算移动平均线

ma = calculate_moving_average(data, period=20)

# ❌ 不好的

# 计算 MA

ma = calculate_moving_average(data, period=20)

# 多余的注释

x = 1  # 设置 x 为 1

```bash

## 常见问题修复

### 问题 1: 长行需要换行

```python

# ❌ 原始代码

result = some_function(argument1, argument2, argument3, argument4, argument5)

# ✅ 修复后

result = some_function(
    argument1, argument2, argument3, argument4, argument5
)

```bash

### 问题 2: 不一致的缩进

```python

# ❌ 原始代码

def function():
  x = 1  # 2 个空格
    y = 2  # 4 个空格

# ✅ 修复后

def function():
    x = 1  # 4 个空格
    y = 2  # 4 个空格

```bash

### 问题 3: 未使用的导入

```python

# ❌ 原始代码

import os
import sys
from typing import Dict

x = 1  # 没有使用 os, sys, Dict

# ✅ 修复后

x = 1

```bash

### 问题 4: 过时的语法

```python

# ❌ 原始代码

class MyClass(object):  # Python 3 不需要显式继承 object
    pass

# ✅ 修复后

class MyClass:
    pass

```bash

## 工具使用指南

### pyupgrade

自动升级 Python 语法到更新的版本。

```bash

# 升级到 Python 3.11+

python -m pyupgrade --py311-plus backtrader/**/*.py

# 查看将要进行的更改(不实际修改)

python -m pyupgrade --py311-plus --diff backtrader/**/*.py

```bash

### ruff

高性能的 linter 和格式化工具。

```bash

# 检查代码问题

python -m ruff check backtrader/

# 自动修复问题

python -m ruff check backtrader/ --fix

# 格式化代码

python -m ruff format backtrader/ --line-length 100

# 查看将要进行的更改

python -m ruff format backtrader/ --diff

```bash

### black

代码格式化工具(可选,ruff format 已足够)。

```bash

# 格式化代码

python -m black backtrader/ --line-length 100

# 检查格式

python -m black backtrader/ --check

```bash

## 测试和验证

### 运行单元测试

```bash

# 运行所有测试

pytest tests/add_tests/

# 运行特定测试

pytest tests/add_tests/test_ind_basicops.py

# 显示覆盖率

pytest tests/add_tests/ --cov=backtrader

```bash

### 检查代码质量

```bash

# 运行所有检查

bash optimize_code.sh

# 或分别运行

python -m pyupgrade --py311-plus backtrader/**/*.py
python -m ruff format backtrader/ --line-length 100
python -m ruff check backtrader/ --fix

```bash

## 最佳实践

### 1. 定期更新工具

```bash
pip install --upgrade pyupgrade ruff black

```bash

### 2. 使用 Pre-commit 钩子

```bash

# 安装

pre-commit install

# 运行(自动在提交前)

pre-commit run --all-files

```bash

### 3. 在 CI/CD 中集成 GitHub Actions 或其他 CI 工具中添加检查步骤。

### 4. 代码审查清单

- [ ] 代码通过 ruff 检查
- [ ] 代码通过 pyupgrade 升级
- [ ] 代码格式符合规范
- [ ] 所有测试通过
- [ ] 没有未使用的导入
- [ ] 变量名清晰明确
- [ ] 异常处理正确
- [ ] 注释清晰有用

## 常用命令速查

| 命令 | 说明 |

|------|------|

| `bash optimize_code.sh` | 运行完整优化 |

| `python -m ruff check backtrader/` | 检查代码问题 |

| `python -m ruff format backtrader/` | 格式化代码 |

| `pytest tests/add_tests/` | 运行所有测试 |

| `pre-commit run --all-files` | 运行所有 pre-commit 钩子 |

## 故障排除

### 问题: 导入排序不正确

- *解决方案**: 使用 ruff  isort 功能

```bash
python -m ruff check backtrader/ --select I --fix

```bash

### 问题: 格式化后仍有错误

- *解决方案**: 运行完整的优化流程

```bash
bash optimize_code.sh

```bash

### 问题: Pre-commit 钩子失败

- *解决方案**: 检查配置文件

```bash
pre-commit validate-config
pre-commit validate-manifest

```bash

## 参考资源

- [PEP 8 风格指南](<https://www.python.org/dev/peps/pep-0008/)>
- [ruff 文档](<https://docs.astral.sh/ruff/)>
- [pyupgrade 文档](<https://github.com/asottile/pyupgrade)>
- [Pre-commit 框架](<https://pre-commit.com/)>

## 获取帮助

如有问题,请:

1. 查看工具的官方文档
2. 运行 `tool --help` 查看帮助信息
3. 提交 Issue  Pull Request

- --
- *最后更新**: 2024-12-10
- *维护者**: Backtrader 开发团队