一键导入
python-project-structure
Python project organization, module architecture, and public API design.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Python project organization, module architecture, and public API design.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
How agents, skills, and commands work in Claude Code projects.
GitHub conventions -- branch naming, commit format, issue/PR templates, and safe issue/PR referencing in comments.
API error response format -- machine-readable codes, human-readable reasons, status code rules.
Language-agnostic code hygiene -- honest comments, no dead/reinvented/duplicated code, truthful names, real implementations, and scoped (never blanket) diagnostic suppressions.
Language-agnostic structural craft -- decompose on responsibility not size, prefer deep modules over shallow piles, and shape cohesion, coupling, interfaces, error contracts, and data invariants. Sibling to code-hygiene and readable-code.
Documentation writing conventions -- style, structure, tone, and quality standards.
| name | python-project-structure |
| description | Python project organization, module architecture, and public API design. |
| when_to_use | Setting up new projects, organizing modules, defining public interfaces with __all__, or planning directory layouts. |
Design well-organized Python projects with clear module boundaries, explicit public interfaces, and maintainable directory structures. Good organization makes code discoverable and changes predictable.
Group related code that changes together. A module should have a single, clear purpose.
Define what's public with __all__. Everything not listed is an internal implementation detail.
Prefer shallow directory structures. Add depth only for genuine sub-domains.
Apply naming and organization patterns uniformly across the project.
myproject/
|-- src/
| `-- myproject/
| |-- __init__.py
| |-- services/
| |-- models/
| `-- api/
|-- tests/
|-- pyproject.toml
`-- README.md
Each file should focus on a single concept or closely related set of functions. Consider splitting when a file:
# Good: Focused files
# user_service.py - User business logic
# user_repository.py - User data access
# user_models.py - User data structures
# Avoid: Kitchen sink files
# user.py - Contains service, repository, models, utilities...
__all__Define the public interface for every module. Unlisted members are internal implementation details.
# mypackage/services/__init__.py
from .user_service import UserService
from .order_service import OrderService
from .exceptions import ServiceError, ValidationError
__all__ = [
"UserService",
"OrderService",
"ServiceError",
"ValidationError",
]
# Internal helpers remain private by omission
# from .internal_helpers import _validate_input # Not exported
Prefer minimal nesting. Deep hierarchies make imports verbose and navigation difficult.
# Preferred: Flat structure
project/
|-- api/
| |-- routes.py
| `-- middleware.py
|-- services/
| |-- user_service.py
| `-- order_service.py
|-- models/
| |-- user.py
| `-- order.py
`-- utils/
`-- validation.py
# Avoid: Deep nesting
project/core/internal/services/impl/user/
Add sub-packages only when there's a genuine sub-domain requiring isolation.
Choose one approach and apply it consistently throughout the project.
Option A: Colocated Tests
src/
|-- user_service.py
|-- test_user_service.py
|-- order_service.py
`-- test_order_service.py
Benefits: Tests live next to the code they verify. Easy to see coverage gaps.
Option B: Parallel Test Directory
src/
|-- services/
| |-- user_service.py
| `-- order_service.py
tests/
|-- services/
| |-- test_user_service.py
| `-- test_order_service.py
Benefits: Clean separation between production and test code. Standard for larger projects.
Use __init__.py to provide a clean public interface for package consumers.
# mypackage/__init__.py
"""MyPackage - A library for doing useful things."""
from .core import MainClass, HelperClass
from .exceptions import PackageError, ConfigError
from .config import Settings
__all__ = [
"MainClass",
"HelperClass",
"PackageError",
"ConfigError",
"Settings",
]
__version__ = "1.0.0"
Consumers can then import directly from the package:
from mypackage import MainClass, Settings
Organize code by architectural layer for clear separation of concerns.
myapp/
|-- api/ # HTTP handlers, request/response
| |-- routes/
| `-- middleware/
|-- services/ # Business logic
|-- repositories/ # Data access
|-- models/ # Domain entities
|-- schemas/ # API schemas (Pydantic)
`-- config/ # Configuration
Each layer should only depend on layers below it, never above.
For complex applications, organize by business domain rather than technical layer.
ecommerce/
|-- users/
| |-- models.py
| |-- services.py
| |-- repository.py
| `-- api.py
|-- orders/
| |-- models.py
| |-- services.py
| |-- repository.py
| `-- api.py
`-- shared/
|-- database.py
`-- exceptions.py
snake_case for all file and module names: user_repository.pyuser_repository.py not usr_repo.pyUserService in user_service.pyUse absolute imports for clarity and reliability:
# Preferred: Absolute imports
from myproject.services import UserService
from myproject.models import User
# Avoid: Relative imports
from ..services import UserService
from . import models
Relative imports can break when modules are moved or reorganized.
__all__ explicitly - Make public interfaces clear