mcpField
P
python

python

github.com/alinaqi開発710274 回インストール2 週間前に更新
リポジトリ

python について

Python 開発者向けのコーディングスキルです。型ヒント、プロジェクト構成、テスト、ツール設定の指針を示し、開発と品質確認の一貫性を支援します。

主な機能

  1. 01関数シグネチャへの型ヒント
  2. 02役割に沿ったプロジェクト構成
  3. 03Ruff と mypy の設定
  4. 04pytest のテストパターン
  5. 05Pydantic によるデータ検証
  6. 06依存性注入と Result パターン

活用シーン

  1. 01Python プロジェクトの開始
  2. 02コード品質ルールの統一
  3. 03自動テストと CI 検査の設定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/alinaqi/maggy --skill python

インストール後、Claude Code で/pythonを入力して読み込まれたか確認します。

詳細

Python スキル


型ヒント

  • すべての関数シグネチャに型ヒントを使用します
  • 複雑な型には typing モジュールを使用します
  • CI で mypy --strict を実行します
def process_user(user_id: int, options: dict[str, Any] | None = None) -> User:
    ...

プロジェクト構成

project/
├── src/
│   └── package_name/
│       ├── __init__.py
│       ├── core/           # Pure business logic
│       │   ├── __init__.py
│       │   ├── models.py   # Pydantic models / dataclasses
│       │   └── services.py # Pure functions
│       ├── infra/          # Side effects
│       │   ├── __init__.py
│       │   ├── api.py      # FastAPI routes
│       │   └── db.py       # Database operations
│       └── utils/          # Shared utilities
├── tests/
│   ├── unit/
│   └── integration/
├── pyproject.toml
└── CLAUDE.md

ツール(必須)

# pyproject.toml
[tool.ruff]
line-length = 100
select = ["E", "F", "I", "N", "W", "UP"]

[tool.mypy]
strict = true

[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "--cov=src --cov-report=term-missing --cov-fail-under=80"

Pytest によるテスト

# tests/unit/test_services.py
import pytest
from package_name.core.services import calculate_total

class TestCalculateTotal:
    def test_returns_sum_of_items(self):
        # Arrange
        items = [{"price": 10}, {"price": 20}]
        
        # Act
        result = calculate_total(items)
        
        # Assert
        assert result == 30

    def test_returns_zero_for_empty_list(self):
        assert calculate_total([]) == 0

    def test_raises_on_invalid_item(self):
        with pytest.raises(ValueError):
            calculate_total([{"invalid": "item"}])

GitHub Actions

name: Python Quality Gate

on: [push, pull_request]

jobs:
  quality:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.12'
          
      - name: Install dependencies
        run: |
          pip install -e ".[dev]"
          
      - name: Lint (Ruff)
        run: ruff check .
        
      - name: Format Check (Ruff)
        run: ruff format --check .
        
      - name: Type Check (mypy)
        run: mypy src/
        
      - name: Test with Coverage
        run: pytest

Pre-Commit フック

# .pre-commit-config.yaml
repos:
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.8.0
    hooks:
      - id: ruff
        args: [--fix]
      - id: ruff-format

  - repo: https://github.com/pre-commit/mirrors-mypy
    rev: v1.13.0
    hooks:
      - id: mypy
        additional_dependencies: [pydantic]
        args: [--strict]

  - repo: local
    hooks:
      - id: pytest
        name: pytest
        entry: pytest tests/unit -x --tb=short
        language: system
        pass_filenames: false
        always_run: true

インストールとセットアップ:

pip install pre-commit
pre-commit install

パターン

データ検証には Pydantic を使用
from pydantic import BaseModel, Field

class CreateUserRequest(BaseModel):
    email: str = Field(..., min_length=5)
    name: str = Field(..., max_length=100)
依存性注入
# Don't import dependencies directly in business logic
# Pass them in

# Bad
from .db import database
def get_user(user_id: int) -> User:
    return database.fetch(user_id)

# Good
def get_user(user_id: int, db: Database) -> User:
    return db.fetch(user_id)
Result パターン(コアで例外を使用しない)
from dataclasses import dataclass

@dataclass
class Result[T]:
    value: T | None
    error: str | None
    
    @property
    def is_ok(self) -> bool:
        return self.error is None

Python のアンチパターン

  • ❌ from module import *
  • ❌ 可変なデフォルト引数
  • ❌ 例外の種類を指定しない except: 句
  • ❌ 説明なしに type: ignore を使用する
  • ❌ 状態管理にグローバル変数を使用する
  • ❌ 関数で十分な場合にクラスを使う

コメント