Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
wshobson avatar

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)
At a glance

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
From the docs

What python-project-structure says it does

Good organization makes code discoverable and changes predictable.
python-project-structure.md
Prefer minimal nesting. Deep hierarchies make imports verbose and navigation difficult.
python-project-structure.md
Each file should focus on a single concept or closely related set of functions.
python-project-structure.md
npx skills add https://github.com/wshobson/agents --skill python-project-structure

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs11.5k
repo stars38.5k
Security audit3 / 3 scanners passed
Last updatedJuly 22, 2026
Repositorywshobson/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

SKILL.mdMarkdownGitHub ↗

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.md

Fundamental 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 exported

Pattern 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.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.

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, Settings

Pattern 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/        # Configuration

Each 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.py

File and Module Naming

Conventions

  • Use snake_case for all file and module names: user_repository.py
  • Avoid abbreviations that obscure meaning: user_repository.py not usr_repo.py
  • Match class names to file names: UserService in user_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 models

Relative 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.

Backend & APIsbackendintegrations

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.