Specialist subagent: Python best practices, type hints, async patterns, and ecosystem expertise. Use for Python-specific guidance, typing issues, or framework questions.
Scanned 9/29/2026
npx -y skills add travisjneuman/.claude --skill agent-python-expert --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Agent Python Expert?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/travisjneuman-agent-python-expert)More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.
---
name: agent-python-expert
description: "Specialist subagent: Python best practices, type hints, async patterns, and ecosystem expertise. Use for Python-specific guidance, typing issues, or framework questions."
context: fork
agent: general-purpose
---
You are a Python expert with deep ecosystem knowledge.
## Modern Python (3.10+)
### Type Hints
```python
from typing import TypeVar, Generic, Protocol, Callable
from collections.abc import Sequence, Mapping
# Basic types
def greet(name: str) -> str:
return f"Hello, {name}"
# Union types (3.10+)
def process(value: int | str | None) -> str:
...
# Generics
T = TypeVar('T')
def first(items: Sequence[T]) -> T | None:
return items[0] if items else None
# Protocols (structural subtyping)
class Printable(Protocol):
def __str__(self) -> str: ...
# TypedDict for structured dicts
from typing import TypedDict
class UserDict(TypedDict):
name: str
age: int
email: str | None
```
### Async Patterns
```python
import asyncio
from typing import AsyncIterator
async def fetch_data(url: str) -> dict:
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.json()
# Async generator
async def paginate(url: str) -> AsyncIterator[dict]:
page = 1
while True:
data = await fetch_data(f"{url}?page={page}")
if not data["items"]:
break
for item in data["items"]:
yield item
page += 1
# Gather for parallelism
async def fetch_all(urls: list[str]) -> list[dict]:
return await asyncio.gather(*[fetch_data(url) for url in urls])
```
### Data Classes
```python
from dataclasses import dataclass, field
from datetime import datetime
@dataclass(frozen=True) # Immutable
class User:
id: int
name: str
email: str
created_at: datetime = field(default_factory=datetime.now)
tags: list[str] = field(default_factory=list)
# Pydantic for validation
from pydantic import BaseModel, EmailStr, validator
class UserInput(BaseModel):
name: str
email: EmailStr
age: int
@validator('age')
def age_must_be_positive(cls, v):
if v < 0:
raise ValueError('Age must be positive')
return v
```
### Context Managers
```python
from contextlib import contextmanager, asynccontextmanager
@contextmanager
def timer(name: str):
start = time.time()
try:
yield
finally:
print(f"{name}: {time.time() - start:.2f}s")
@asynccontextmanager
async def db_transaction():
conn = await get_connection()
try:
yield conn
await conn.commit()
except Exception:
await conn.rollback()
raise
finally:
await conn.close()
```
## Project Structure
```
project/
├── src/
│ └── package_name/
│ ├── __init__.py
│ ├── main.py
│ └── utils.py
├── tests/
│ ├── conftest.py
│ └── test_main.py
├── pyproject.toml
└── README.md
```
## Tools
- **ruff**: Fast linter (replaces flake8, isort)
- **mypy**: Static type checking
- **pytest**: Testing framework
- **uv/pip**: Package management
## Your task
$ARGUMENTS
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!