python-dev
20
总安装量
11
周安装量
#18152
全站排名
安装命令
npx skills add https://github.com/doccker/cc-use-exp --skill python-dev
Agent 安装分布
gemini-cli
8
claude-code
8
opencode
8
codex
8
windsurf
6
Skill 文档
Python å¼åè§è
åèæ¥æº: PEP 8ãGoogle Python Style Guide
å·¥å ·é¾
# æ ¼å¼å
black . # ä»£ç æ ¼å¼å
isort . # import æåº
# ç±»åæ£æ¥
mypy . # éæç±»åæ£æ¥
pyright . # å¤é
# ä»£ç æ£æ¥
ruff check . # å¿«é linterï¼æ¨èï¼
flake8 . # ä¼ ç» 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, Union
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]:
"""æ ¹æ® ID æ¥æ¾ç¨æ·"""
...
def process_items(items: List[str]) -> Dict[str, int]:
"""å¤ç项ç®å表"""
return {item: len(item) for item in items}
# 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
èªå®ä¹å¼å¸¸
class ServiceError(Exception):
"""æå¡å±å¼å¸¸åºç±»"""
def __init__(self, message: str, code: str = "UNKNOWN"):
super().__init__(message)
self.code = code
class UserNotFoundError(ServiceError):
"""ç¨æ·ä¸åå¨"""
def __init__(self, user_id: int):
super().__init__(f"User {user_id} not found", "USER_NOT_FOUND")
self.user_id = user_id
æ¥å¿è§è
import logging
logger = logging.getLogger(__name__)
# â
好ï¼ä½¿ç¨åæ°åæ¥å¿
logger.debug("Finding user by id: %s", user_id)
logger.info("User %s logged in successfully", username)
logger.error("Failed to process order %s", order_id, exc_info=True)
# â å·®ï¼f-stringï¼å³ä½¿ä¸è¾åºä¹ä¼è®¡ç®ï¼
logger.debug(f"Finding user by id: {user_id}")
æµè¯è§èï¼pytestï¼
import pytest
from unittest.mock import Mock, patch
class TestUserService:
@pytest.fixture
def user_service(self):
repository = Mock()
return UserService(repository)
def test_find_by_id_returns_user(self, user_service):
# given
expected = User(id=1, name="test")
user_service.repository.find_by_id.return_value = expected
# when
result = user_service.find_by_id(1)
# then
assert result == expected
user_service.repository.find_by_id.assert_called_once_with(1)
def test_find_by_id_raises_when_not_found(self, user_service):
# given
user_service.repository.find_by_id.return_value = None
# when/then
with pytest.raises(UserNotFoundError):
user_service.find_by_id(999)
# åæ°åæµè¯
@pytest.mark.parametrize("input,expected", [
(1, 1),
(2, 4),
(3, 9),
])
def test_square(input, expected):
assert square(input) == expected
弿¥ç¼ç¨
import asyncio
from typing import List
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_all_users(user_ids: List[int]) -> List[User]:
"""å¹¶åè·åå¤ä¸ªç¨æ·"""
tasks = [fetch_user(uid) for uid in user_ids]
return await asyncio.gather(*tasks)
# éå¶å¹¶åæ°
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])
项ç®ç»æ
project/
âââ src/
â âââ myproject/
â âââ __init__.py
â âââ models/
â âââ services/
â âââ repositories/
â âââ utils/
âââ tests/
â âââ __init__.py
â âââ conftest.py
â âââ test_*.py
âââ pyproject.toml
âââ requirements.txt
âââ README.md
ä¾èµç®¡ç
# pyproject.toml (æ¨è)
[project]
name = "myproject"
version = "1.0.0"
dependencies = [
"fastapi>=0.100.0",
"sqlalchemy>=2.0.0",
]
[project.optional-dependencies]
dev = [
"pytest>=7.0.0",
"black>=23.0.0",
"mypy>=1.0.0",
]
æ§è½ä¼å
| åºæ¯ | æ¹æ¡ |
|---|---|
| å¤§æ°æ®å¤ç | 使ç¨çæå¨ yield |
| åç¬¦ä¸²æ¼æ¥ | ä½¿ç¨ ''.join() |
| æ¥æ¾æä½ | ä½¿ç¨ set æ dict |
| å¹¶å I/O | ä½¿ç¨ asyncio |
| CPU å¯é | ä½¿ç¨ multiprocessing |
# â
使ç¨çæå¨
def read_large_file(file_path: str):
with open(file_path, 'r') as f:
for line in f:
yield line.strip()
# â
髿åç¬¦ä¸²æ¼æ¥
result = ''.join(strings) # è䏿¯ += 循ç¯
ð æ¬åå¤éµå¾ªï¼
python-dev– [å ·ä½ç« è]