Initial commit with translated description
This commit is contained in:
157
SKILL.md
Normal file
157
SKILL.md
Normal file
@@ -0,0 +1,157 @@
|
||||
---
|
||||
name: python
|
||||
description: "Python编码指南和最佳实践。在编写、审查或重构Python代码时使用。强制执行PEP 8风格、通过py_compile进行语法验证、执行单元测试、仅使用现代Python版本(无EOL)、可用时使用uv进行依赖管理,以及地道的Python模式。"
|
||||
---
|
||||
|
||||
# Python Coding Guidelines
|
||||
|
||||
## Code Style (PEP 8)
|
||||
|
||||
- 4 spaces for indentation (never tabs)
|
||||
- Max line length: 88 chars (Black default) or 79 (strict PEP 8)
|
||||
- Two blank lines before top-level definitions, one within classes
|
||||
- Imports: stdlib → third-party → local, alphabetized within groups
|
||||
- Snake_case for functions/variables, PascalCase for classes, UPPER_CASE for constants
|
||||
|
||||
## Before Committing
|
||||
|
||||
```bash
|
||||
# Syntax check (always)
|
||||
python -m py_compile *.py
|
||||
|
||||
# Run tests if present
|
||||
python -m pytest tests/ -v 2>/dev/null || python -m unittest discover -v 2>/dev/null || echo "No tests found"
|
||||
|
||||
# Format check (if available)
|
||||
ruff check . --fix 2>/dev/null || python -m black --check . 2>/dev/null
|
||||
```
|
||||
|
||||
## Python Version
|
||||
|
||||
- **Minimum:** Python 3.10+ (3.9 EOL Oct 2025)
|
||||
- **Target:** Python 3.11-3.13 for new projects
|
||||
- Never use Python 2 syntax or patterns
|
||||
- Use modern features: match statements, walrus operator, type hints
|
||||
|
||||
## Dependency Management
|
||||
|
||||
Check for uv first, fall back to pip:
|
||||
```bash
|
||||
# Prefer uv if available
|
||||
if command -v uv &>/dev/null; then
|
||||
uv pip install <package>
|
||||
uv pip compile requirements.in -o requirements.txt
|
||||
else
|
||||
pip install <package>
|
||||
fi
|
||||
```
|
||||
|
||||
For new projects with uv: `uv init` or `uv venv && source .venv/bin/activate`
|
||||
|
||||
## Pythonic Patterns
|
||||
|
||||
```python
|
||||
# ✅ List/dict comprehensions over loops
|
||||
squares = [x**2 for x in range(10)]
|
||||
lookup = {item.id: item for item in items}
|
||||
|
||||
# ✅ Context managers for resources
|
||||
with open("file.txt") as f:
|
||||
data = f.read()
|
||||
|
||||
# ✅ Unpacking
|
||||
first, *rest = items
|
||||
a, b = b, a # swap
|
||||
|
||||
# ✅ EAFP over LBYL
|
||||
try:
|
||||
value = d[key]
|
||||
except KeyError:
|
||||
value = default
|
||||
|
||||
# ✅ f-strings for formatting
|
||||
msg = f"Hello {name}, you have {count} items"
|
||||
|
||||
# ✅ Type hints
|
||||
def process(items: list[str]) -> dict[str, int]:
|
||||
...
|
||||
|
||||
# ✅ dataclasses/attrs for data containers
|
||||
from dataclasses import dataclass
|
||||
|
||||
@dataclass
|
||||
class User:
|
||||
name: str
|
||||
email: str
|
||||
active: bool = True
|
||||
|
||||
# ✅ pathlib over os.path
|
||||
from pathlib import Path
|
||||
config = Path.home() / ".config" / "app.json"
|
||||
|
||||
# ✅ enumerate, zip, itertools
|
||||
for i, item in enumerate(items):
|
||||
...
|
||||
for a, b in zip(list1, list2, strict=True):
|
||||
...
|
||||
```
|
||||
|
||||
## Anti-patterns to Avoid
|
||||
|
||||
```python
|
||||
# ❌ Mutable default arguments
|
||||
def bad(items=[]): # Bug: shared across calls
|
||||
...
|
||||
def good(items=None):
|
||||
items = items or []
|
||||
|
||||
# ❌ Bare except
|
||||
try:
|
||||
...
|
||||
except: # Catches SystemExit, KeyboardInterrupt
|
||||
...
|
||||
except Exception: # Better
|
||||
...
|
||||
|
||||
# ❌ Global state
|
||||
# ❌ from module import *
|
||||
# ❌ String concatenation in loops (use join)
|
||||
# ❌ == None (use `is None`)
|
||||
# ❌ len(x) == 0 (use `not x`)
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
- Use pytest (preferred) or unittest
|
||||
- Name test files `test_*.py`, test functions `test_*`
|
||||
- Aim for focused unit tests, mock external dependencies
|
||||
- Run before every commit: `python -m pytest -v`
|
||||
|
||||
## Docstrings
|
||||
|
||||
```python
|
||||
def fetch_user(user_id: int, include_deleted: bool = False) -> User | None:
|
||||
"""Fetch a user by ID from the database.
|
||||
|
||||
Args:
|
||||
user_id: The unique user identifier.
|
||||
include_deleted: If True, include soft-deleted users.
|
||||
|
||||
Returns:
|
||||
User object if found, None otherwise.
|
||||
|
||||
Raises:
|
||||
DatabaseError: If connection fails.
|
||||
"""
|
||||
```
|
||||
|
||||
## Quick Checklist
|
||||
|
||||
- [ ] Syntax valid (`py_compile`)
|
||||
- [ ] Tests pass (`pytest`)
|
||||
- [ ] Type hints on public functions
|
||||
- [ ] No hardcoded secrets
|
||||
- [ ] f-strings, not `.format()` or `%`
|
||||
- [ ] `pathlib` for file paths
|
||||
- [ ] Context managers for I/O
|
||||
- [ ] No mutable default args
|
||||
6
_meta.json
Normal file
6
_meta.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"ownerId": "kn74pvnwzfvrkt24pe776y32rx80fctm",
|
||||
"slug": "python",
|
||||
"version": "1.0.0",
|
||||
"publishedAt": 1770116732964
|
||||
}
|
||||
Reference in New Issue
Block a user