
Python Project Structure
- 11.5k installs
- 38.5k repo stars
- Updated July 22, 2026
- wshobson/agents
How to design maintainable Python project layouts with clear module boundaries, explicit public interfaces, and consistent directory organization.
About
This skill teaches how to design well-organized Python projects using module cohesion, explicit interfaces via __all__, and flat directory hierarchies. Developers use it when starting new projects, reorganizing codebases, or defining public APIs. Key workflows include choosing between flat and nested structures, deciding test file placement (colocated vs. parallel), applying layered or domain-driven architecture patterns, and writing focused modules around single concepts. The skill covers patterns like one-concept-per-file, package initialization, consistent naming conventions, and absolute imports to ensure code remains discoverable and changes predictable.
- Define public module interfaces explicitly using __all__ to mark implementation details as internal
- Keep files focused on a single concept; consider splitting files exceeding 300-500 lines
- Use flat directory structures; add nesting only for genuine business sub-domains
- Apply layered (api/services/repositories/models) or domain-driven architecture consistently
- Use absolute imports and snake_case naming for clarity and reliability across reorganization
Python Project Structure by the numbers
- 11,456 all-time installs (skills.sh)
- +253 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #68 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
python-project-structure capabilities & compatibility
- Capabilities
- design layered architecture patterns · design domain driven architecture patterns · define public module interfaces with __all__ · organize test files (colocated or parallel) · apply naming conventions and import strategies
- Use cases
- api development · code review · refactoring · documentation
What python-project-structure says it does
Good organization makes code discoverable and changes predictable.
Prefer minimal nesting. Deep hierarchies make imports verbose and navigation difficult.
Each file should focus on a single concept or closely related set of functions.
npx skills add https://github.com/wshobson/agents --skill python-project-structureAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 11.5k |
|---|---|
| repo stars | ★ 38.5k |
| Security audit | 3 / 3 scanners passed |
| Last updated | July 22, 2026 |
| Repository | wshobson/agents ↗ |
What it does
Organize Python projects with clear module boundaries, explicit public APIs, and maintainable directory structures.
Who is it for?
Building new Python projects, reorganizing legacy codebases, defining reusable library packages, establishing team coding standards for module design.
Skip if: Quick scripts, one-off utilities, projects with no anticipated growth or reuse.
When should I use this skill?
Starting a new Python project, refactoring an existing codebase, designing a reusable library, defining public API for a package, planning test file placement, deciding directory depth.
What you get
A well-organized Python project with focused modules, explicit __all__ interfaces, shallow directory structures, and consistent naming that developers can navigate and modify with confidence.
- Project directory structure
- Module public APIs via __all__
- Architectural pattern (layered or domain-driven)
By the numbers
- Recommends splitting modules when exceeding 300-500 lines of code
- Demonstrates patterns across 7 fundamental module organization approaches
- Covers both colocated and parallel test directory strategies
Files
Python Project Structure & Module Architecture
Design well-organized Python projects with clear module boundaries, explicit public interfaces, and maintainable directory structures. Good organization makes code discoverable and changes predictable.
When to Use This Skill
- Starting a new Python project from scratch
- Reorganizing an existing codebase for clarity
- Defining module public APIs with
__all__ - Deciding between flat and nested directory structures
- Determining test file placement strategies
- Creating reusable library packages
Core Concepts
1. Module Cohesion
Group related code that changes together. A module should have a single, clear purpose.
2. Explicit Interfaces
Define what's public with __all__. Everything not listed is an internal implementation detail.
3. Flat Hierarchies
Prefer shallow directory structures. Add depth only for genuine sub-domains.
4. Consistent Conventions
Apply naming and organization patterns uniformly across the project.
Quick Start
myproject/
├── src/
│ └── myproject/
│ ├── __init__.py
│ ├── services/
│ ├── models/
│ └── api/
├── tests/
├── pyproject.toml
└── README.mdFundamental Patterns
Pattern 1: One Concept Per File
Each file should focus on a single concept or closely related set of functions. Consider splitting when a file:
- Handles multiple unrelated responsibilities
- Grows beyond 300-500 lines (varies by complexity)
- Contains classes that change for different reasons
# 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...Pattern 2: Explicit Public APIs with __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 exportedPattern 3: Flat Directory Structure
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.
Pattern 4: Test File Organization
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.pyBenefits: 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.pyBenefits: Clean separation between production and test code. Standard for larger projects.
Advanced Patterns
Pattern 5: Package Initialization
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, SettingsPattern 6: Layered Architecture
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/ # ConfigurationEach layer should only depend on layers below it, never above.
Pattern 7: Domain-Driven Structure
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.pyFile and Module Naming
Conventions
- Use
snake_casefor all file and module names:user_repository.py - Avoid abbreviations that obscure meaning:
user_repository.pynotusr_repo.py - Match class names to file names:
UserServiceinuser_service.py
Import Style
Use 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 modelsRelative imports can break when modules are moved or reorganized.
Best Practices Summary
1. Keep files focused - One concept per file, consider splitting at 300-500 lines (varies by complexity) 2. Define `__all__` explicitly - Make public interfaces clear 3. Prefer flat structures - Add depth only for genuine sub-domains 4. Use absolute imports - More reliable and clearer 5. Be consistent - Apply patterns uniformly across the project 6. Match names to content - File names should describe their purpose 7. Separate concerns - Keep layers distinct and dependencies flowing one direction 8. Document your structure - Include a README explaining the organization
Related skills
How it compares
Use python-project-structure for package-level architecture; pair with framework-specific skills when scaffolding FastAPI or Django app internals.
FAQ
When should I split code into separate files?
Split when a file handles multiple unrelated responsibilities, exceeds 300-500 lines, or contains classes that change for different reasons. Each file should focus on one concept.
What is __all__ and why is it important?
__all__ is a list in Python modules that explicitly marks which names are part of the public interface. Everything not in __all__ is considered internal implementation detail, making your API clear and refactoring safer.
Should I use colocated tests (next to code) or a parallel tests/ directory?
Colocated tests make coverage gaps visible and keep tests near code; parallel test directories provide clean separation and are standard for larger projects. Choose one and apply consistently across the entire project.
Is Python Project Structure safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.