python-development について
python-developmentは、開発者やライブラリー作者向けに、Python 3.10以降のコードを書くための言語知識と実践方法を提供します。型ヒント、非同期処理、デバッグ、プロファイリング、Pythonらしい設計を扱い、プロジェクト作成やテストなどは専用スキルに案内します。
主な機能
- 01Python 3.10以降の言語機能
- 02型ヒントとデコレーター
- 03async/awaitとasyncio
- 04デバッグとプロファイリング
- 05Pythonらしい設計の実践
活用シーン
- 01ライブラリーコードへの型ヒント追加
- 02非同期タスクフローの設計
- 03コードのデバッグとプロファイリング
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ laurigates/ claude-plugins --skill python-developmentインストール後、Claude Code で/python-developmentを入力して読み込まれたか確認します。
同梱ファイルREFERENCE.md
詳細
Python 開発
Python 言語の基本概念、イディオム、ベストプラクティスです。
このスキルを使う場面
| 次の場合はこのスキルを使います… | 次の場合は代わりに専門の関連スキルを使います… |
|---|---|
| イディオムに沿った Python 3.10 以降のコードを書く場合(match 文、構造的パターンマッチング、PEP 604 のユニオン型) | 単一のスクリプトや一度限りのコマンドを実行する場合 — uv-run を使います |
| ライブラリコードに型ヒント、デコレーター、コンテキストマネージャーを追加する場合 | プロジェクトを初期化する場合、または依存関係を追加する場合 — uv-project-management を使います |
| async/await のフローを設計する場合、または Python らしいパターンにリファクタリングする場合 | pytest のテストを書く場合、または実行する場合 — python-testing を使います |
主な専門分野
- Python 言語:最新の Python 3.10 以降の機能とイディオム
- ベストプラクティス:Python らしいコード、デザインパターン、SOLID 原則
- デバッグ:対話型デバッグとプロファイリングの手法
- パフォーマンス:最適化戦略とプロファイリング
- 非同期プログラミング:async/await パターンと asyncio
最新の Python 機能(3.10 以降)
型ヒント
# Modern syntax (Python 3.10+)
def process_items(
items: list[str], # Not List[str]
mapping: dict[str, int], # Not Dict[str, int]
optional: str | None = None, # Not Optional[str]
) -> tuple[bool, str]: # Not Tuple[bool, str]
"""Process items with modern type hints."""
return True, "success"
# Type aliases
type UserId = int
type UserDict = dict[str, str | int]
def get_user(user_id: UserId) -> UserDict:
return {"id": user_id, "name": "Alice"}
パターンマッチング(3.10 以降)
def handle_command(command: dict) -> str:
match command:
case {"action": "create", "item": item}:
return f"Creating {item}"
case {"action": "delete", "item": item}:
return f"Deleting {item}"
case {"action": "list"}:
return "Listing items"
case _:
return "Unknown command"
構造的パターンマッチング
def process_response(response):
match response:
case {"status": 200, "data": data}:
return process_success(data)
case {"status": 404}:
raise NotFoundError()
case {"status": code} if code >= 500:
raise ServerError(code)
Python のイディオム
コンテキストマネージャー
# File handling
with open("file.txt") as f:
content = f.read()
# Custom context manager
from contextlib import contextmanager
@contextmanager
def database_connection():
conn = create_connection()
try:
yield conn
finally:
conn.close()
with database_connection() as conn:
conn.execute("SELECT * FROM users")
リスト内包表記
# List comprehension
squares = [x**2 for x in range(10)]
# Dict comprehension
word_lengths = {word: len(word) for word in ["hello", "world"]}
# Set comprehension
unique_lengths = {len(word) for word in ["hello", "world", "hi"]}
# Generator expression
sum_of_squares = sum(x**2 for x in range(1000000)) # Memory efficient
イテレーターとジェネレーター
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
# Use generator
fib = fibonacci()
first_ten = [next(fib) for _ in range(10)]
# Generator expression
even_squares = (x**2 for x in range(10) if x % 2 == 0)
デバッグ
対話型デバッグ
import pdb
def problematic_function():
value = calculate()
pdb.set_trace() # Debugger breakpoint
return process(value)
# Debug on error
python -m pdb script.py
# pytest with debugger
uv run pytest --pdb # Drop into pdb on failure
uv run pytest --pdb --pdbcls=IPython.terminal.debugger:TerminalPdb
パフォーマンスのプロファイリング
# CPU profiling
uv run python -m cProfile -s cumtime script.py | head -20
# Line-by-line profiling (temporary dependency)
uv run --with line-profiler kernprof -l -v script.py
# Memory profiling (temporary dependency)
uv run --with memory-profiler python -m memory_profiler script.py
# Real-time profiling (ephemeral tool)
uvx py-spy top -- python script.py
# Quick profiling with scalene
uv run --with scalene python -m scalene script.py
組み込みのデバッグツール
# Trace execution
import sys
def trace_calls(frame, event, arg):
if event == 'call':
print(f"Calling {frame.f_code.co_name}")
return trace_calls
sys.settrace(trace_calls)
# Memory tracking
import tracemalloc
tracemalloc.start()
# ... code to profile
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
for stat in top_stats[:10]:
print(stat)
非同期プログラミング
async/await の基本
import asyncio
async def fetch_data(url: str) -> dict:
async with httpx.AsyncClient() as client:
response = await client.get(url)
return response.json()
async def main():
result = await fetch_data("https://api.example.com")
print(result)
asyncio.run(main())
並行タスク
async def process_multiple():
# Run concurrently
results = await asyncio.gather(
fetch_data("url1"),
fetch_data("url2"),
fetch_data("url3"),
)
return results
# With timeout
async def with_timeout():
try:
result = await asyncio.wait_for(fetch_data("url"), timeout=5.0)
except asyncio.TimeoutError:
print("Request timed out")
デザインパターン
依存性注入
from typing import Protocol
class Database(Protocol):
def query(self, sql: str) -> list: ...
def get_users(db: Database) -> list:
return db.query("SELECT * FROM users")
ファクトリーパターン
def create_handler(handler_type: str):
match handler_type:
case "json":
return JSONHandler()
case "xml":
return XMLHandler()
case _:
raise ValueError(f"Unknown handler: {handler_type}")
デコレーターパターン
from functools import wraps
import time
def timer(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} took {end - start:.2f}s")
return result
return wrapper
@timer
def slow_function():
time.sleep(1)
ベストプラクティス
SOLID 原則
単一責任:
# Bad: Class does too much
class User:
def save(self): pass
def send_email(self): pass
def generate_report(self): pass
# Good: Separate concerns
class User:
def save(self): pass
class EmailService:
def send_email(self, user): pass
class ReportGenerator:
def generate(self, user): pass
フェイルファスト
def process_data(data: dict) -> str:
# Validate early
if not data:
raise ValueError("Data cannot be empty")
if "required_field" not in data:
raise KeyError("Missing required field")
# Process with confidence
return data["required_field"].upper()
関数型アプローチ
# Prefer immutable transformations
def process_items(items: list[int]) -> list[int]:
return [item * 2 for item in items] # New list
# Over mutations
def process_items_bad(items: list[int]) -> None:
for i in range(len(items)):
items[i] *= 2 # Mutates input
プロジェクト構成(src レイアウト)
my-project/
├── pyproject.toml
├── README.md
├── src/
│ └── my_project/
│ ├── __init__.py
│ ├── core.py
│ ├── utils.py
│ └── models.py
└── tests/
├── conftest.py
├── test_core.py
└── test_utils.py
関連項目
- uv-run - スクリプトの実行、一時的な依存関係、PEP 723
- uv-project-management - プロジェクトのセットアップと依存関係の管理
- uv-tool-management - CLI ツールのグローバルインストール
- python-testing - pytest によるテスト
- python-code-quality - ruff/ty によるリンティングと型チェック
- python-packaging - パッケージのビルドと公開
- uv-python-versions - Python インタープリターの管理
参考資料
- Python ドキュメント:https://docs.python.org/3/
- 型ヒント:https://docs.python.org/3/library/typing.html
- 非同期処理:https://docs.python.org/3/library/asyncio.html
- 詳細なガイド:REFERENCE.md を参照してください
コメント
Markdown 対応