Functions and Returns

Guidance

  • A function should have a single responsibility and a stable return type.
  • Avoid returning error tuples in Python; raise exceptions instead.
  • Use partial or small wrapper functions when you need specialized behavior.

Bad Example

def get_users(user_id=None):
    if user_id is not None:
        return User.get(user_id)
    return User.filter(is_active=True)

Good Example

def get_user_by_id(user_id):
    return User.get(user_id)


def get_active_users():
    return User.filter(is_active=True)

Bad Example

def create_item(name):
    if len(name) > MAX_LENGTH_OF_NAME:
        return None, "name of item is too long"
    if len(CURRENT_ITEMS) > MAX_ITEMS_QUOTA:
        return None, "items quota is full"
    return Item(name=name), ""

Good Example

class CreateItemError(Exception):
    """Raised when an item cannot be created."""


def create_item(name):
    if len(name) > MAX_LENGTH_OF_NAME:
        raise CreateItemError("name of item is too long")
    if len(CURRENT_ITEMS) > MAX_ITEMS_QUOTA:
        raise CreateItemError("items quota is full")
    return Item(name=name)

Sources & References