A customized package is a collection of Python modules organized in a directory hierarchy that you create to solve specific problems or implement particular functionality. Packages help you organize your code into logical, reusable components.
A basic Python package has this structure:
my_package/
│
├── __init__.py # Package initialization file
├── module1.py # First module
├── module2.py # Second module
├── subpackage/ # Subpackage directory
│ ├── __init__.py
│ └── submodule.py
└── tests/ # Tests directory
└── test_module1.py
__init__.py
: Makes a directory a Python package (can be empty)File structure:
math_utils/
├── __init__.py
├── basic_operations.py
└── advanced_operations.py
basic_operations.py:
def add(a, b):
return a + b
def subtract(a, b):
return a - b
advanced_operations.py:
def factorial(n):
if n == 0:
return 1
return n * factorial(n-1)
def power(base, exp):
return base ** exp
__init__.py:
from .basic_operations import add, subtract
from .advanced_operations import factorial, power
__all__ = ['add', 'subtract', 'factorial', 'power']
# Option 1: Import specific functions
from math_utils import add, factorial
print(add(5, 3)) # 8
print(factorial(5)) # 120
# Option 2: Import the whole package
import math_utils
print(math_utils.power(2, 3)) # 8
Structure:
data_tools/
├── __init__.py
├── cleaning.py
├── visualization.py
└── analysis.py
cleaning.py:
import pandas as pd
def remove_duplicates(df):
return df.drop_duplicates()
def fill_missing(df, strategy='mean'):
if strategy == 'mean':
return df.fillna(df.mean())
elif strategy == 'median':
return df.fillna(df.median())
return df.fillna(0)
visualization.py:
import matplotlib.pyplot as plt
def plot_distribution(data, column):
plt.hist(data[column])
plt.title(f'Distribution of {column}')
plt.show()
Structure:
web_scraper/
├── __init__.py
├── scraper.py
├── parser.py
└── storage.py
scraper.py:
import requests
from bs4 import BeautifulSoup
def get_page(url):
response = requests.get(url)
return response.text if response.status_code == 200 else None
def extract_links(html):
soup = BeautifulSoup(html, 'html.parser')
return [a['href'] for a in soup.find_all('a', href=True)]
__init__.py with initialization:
print(f"Initializing {__name__} package")
# Package version
__version__ = '1.0.0'
# Import commonly used functions
from .basic_operations import *
from .advanced_operations import *
submodule.py:
from ..basic_operations import add # Import from parent package
To make your package installable:
from setuptools import setup, find_packages
setup(
name="math_utils",
version="1.0.0",
packages=find_packages(),
install_requires=[], # List dependencies
author="Your Name",
description="A collection of math utilities"
)
Install with: pip install -e .
# In __init__.py
def get_processor(type):
if type == "basic":
from .basic import BasicProcessor
return BasicProcessor()
elif type == "advanced":
from .advanced import AdvancedProcessor
return AdvancedProcessor()
# Load plugins dynamically
def load_plugins(plugin_dir):
for filename in os.listdir(plugin_dir):
if filename.endswith('.py'):
module = importlib.import_module(f"plugins.{filename[:-3]}")
register_plugin(module.PluginClass())
# config.py
class Config:
DEBUG = False
DATABASE_URI = 'sqlite:///default.db'
# __init__.py
from .config import Config
config = Config()
Creating well-structured custom packages will make your Python code more organized, reusable, and maintainable, whether you’re working on small scripts or large applications.