Quick Start

Get started with SmartSeeds in 5 minutes.

Installation

pip install smartseeds

Basic Usage

The extract_kwargs decorator is the main feature of SmartSeeds. It extracts keyword arguments by prefix into separate parameter groups.

Example: Service Configuration

from smartseeds import extract_kwargs

class MyService:
    @extract_kwargs(logging=True, cache=True)
    def __init__(self, name, logging_kwargs=None, cache_kwargs=None, **kwargs):
        self.name = name
        self.logging_config = logging_kwargs or {}
        self.cache_config = cache_kwargs or {}
        self.other_config = kwargs

    def show_config(self):
        print(f"Service: {self.name}")
        print(f"Logging: {self.logging_config}")
        print(f"Cache: {self.cache_config}")
        print(f"Other: {self.other_config}")

# Create service with prefixed parameters
service = MyService(
    name="api",
    logging_level="INFO",      # → logging_kwargs
    logging_format="json",     # → logging_kwargs
    cache_ttl=300,             # → cache_kwargs
    cache_backend="redis",     # → cache_kwargs
    timeout=30                 # → kwargs
)

service.show_config()
# Output:
# Service: api
# Logging: {'level': 'INFO', 'format': 'json'}
# Cache: {'ttl': 300, 'backend': 'redis'}
# Other: {'timeout': 30}

From test

Three Calling Styles

SmartSeeds supports three convenient ways to pass parameters:

Style 1: Prefix Style (Most Explicit)

service = MyService(
    name="api",
    logging_level="INFO",
    logging_format="json"
)
# logging_kwargs = {'level': 'INFO', 'format': 'json'}

Style 2: Dict Style (Compact)

service = MyService(
    name="api",
    logging={'level': 'INFO', 'format': 'json'}
)
# Same result as Style 1

Style 3: Boolean Activation (Use Defaults)

service = MyService(
    name="api",
    logging=True  # Activates with empty dict
)
# logging_kwargs = {}

Multiple Prefix Families

Extract multiple groups of parameters:

@extract_kwargs(logging=True, cache=True, db=True)
def setup_app(name, logging_kwargs=None, cache_kwargs=None, db_kwargs=None, **kwargs):
    print(f"Logging: {logging_kwargs}")
    print(f"Cache: {cache_kwargs}")
    print(f"Database: {db_kwargs}")
    print(f"Other: {kwargs}")

# All these parameters are organized automatically
setup_app(
    name="myapp",
    logging_level="DEBUG",
    logging_file="app.log",
    cache_ttl=600,
    cache_backend="memcached",
    db_host="localhost",
    db_port=5432,
    db_name="mydb",
    timeout=30
)

From test

Why Use extract_kwargs?

Problem: Nested Configuration is Messy

Without extract_kwargs (verbose and unclear):

def connect(host, port,
            logging_level=None, logging_format=None, logging_file=None,
            cache_ttl=None, cache_backend=None):
    # Too many parameters!
    logger = Logger(level=logging_level, format=logging_format, file=logging_file)
    cache = Cache(ttl=cache_ttl, backend=cache_backend)

With extract_kwargs (clean and flexible):

@extract_kwargs(logging=True, cache=True)
def connect(host, port, logging_kwargs=None, cache_kwargs=None):
    if logging_kwargs:
        logger = Logger(**logging_kwargs)
    if cache_kwargs:
        cache = Cache(**cache_kwargs)

Next Steps