mcpbeat Sign in

Python Dev Agent Skill

>- Python 开发规范。当用户操作 .py、pyproject.toml、requirements.txt、setup.py 文件, 或涉及 FastAPI、Django、Flask、pytest、asyncio 开发时触发。 包含 PEP 8 风格、类型注解、异常处理、测试规范、异步编程、性能优化等。

931 tokens
context cost
SKILL.md, read when the skill is used
1
files
instructions only
0
copies elsewhere
how many repositories repackaged it
1 027
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/doccker/cc-use-exp --skill python-dev

The instruction itself

2 sections, as written by the author

Python 开发规范

> 参考来源: PEP 8、Google Python Style Guide


工具链

black .                              # 代码格式化
isort .                              # import 排序
mypy .                               # 静态类型检查
ruff check .                         # 快速 linter(推荐)
pytest -v                            # 运行测试
pytest --cov=src                     # 覆盖率

命名约定

| 类型 | 规则 | 示例 |

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

| 模块/包 | 小写下划线 | user_service.py |

| 类名 | 大驼峰 | UserService, HttpClient |

| 函数/变量 | 小写下划线 | get_user_by_id, user_name |

| 常量 | 全大写下划线 | MAX_RETRY_COUNT |

| 私有 | 单下划线前缀 | _internal_method |


类型注解

from typing import Optional, List, Dict
from dataclasses import dataclass

@dataclass
class User:
    id: int
    name: str
    email: Optional[str] = None

def find_user_by_id(user_id: int) -> Optional[User]:
    ...

# Python 3.10+ 可用新语法
def greet(name: str | None = None) -> str:
    return f"Hello, {name or 'World'}"

异常处理

# ✅ 好:捕获具体异常
try:
    user = repository.find_by_id(user_id)
except DatabaseError as e:
    logger.error(f"Failed to find user {user_id}: {e}")
    raise ServiceError(f"Database error: {e}") from e

# ✅ 好:上下文管理器
with open("file.txt", "r") as f:
    content = f.read()

# ❌ 差:裸 except
try:
    do_something()
except:
    pass

测试规范(pytest)

import pytest
from unittest.mock import Mock

class TestUserService:
    @pytest.fixture
    def user_service(self):
        repository = Mock()
        return UserService(repository)

    def test_find_by_id_returns_user(self, user_service):
        expected = User(id=1, name="test")
        user_service.repository.find_by_id.return_value = expected
        result = user_service.find_by_id(1)
        assert result == expected

# 参数化测试
@pytest.mark.parametrize("input,expected", [
    (1, 1), (2, 4), (3, 9),
])
def test_square(input, expected):
    assert square(input) == expected

异步编程

import asyncio

async def fetch_user(user_id: int) -> User:
    async with aiohttp.ClientSession() as session:
        async with session.get(f"/api/users/{user_id}") as response:
            data = await response.json()
            return User(**data)

# 限制并发数
async def fetch_with_limit(user_ids: list[int], limit: int = 10) -> list[User]:
    semaphore = asyncio.Semaphore(limit)
    async def fetch_one(uid: int) -> User:
        async with semaphore:
            return await fetch_user(uid)
    return await asyncio.gather(*[fetch_one(uid) for uid in user_ids])

性能优化

| 场景 | 方案 |

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

| 大数据处理 | 使用生成器 yield |

| 字符串拼接 | 使用 ''.join() |

| 查找操作 | 使用 set 或 dict |

| 并发 I/O | 使用 asyncio |

| CPU 密集 | 使用 multiprocessing |


项目结构

project/
├── src/
│   └── myproject/
│       ├── __init__.py
│       ├── models/
│       ├── services/
│       └── utils/
├── tests/
│   ├── conftest.py
│   └── test_*.py
├── pyproject.toml
└── README.md

How to use it

Copy the folder

Take doccker/cc-use-exp-.cursor-python-dev from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.