← Назад к вопросам

Какие знаешь способы параметризации функции?

1.0 Junior🔥 251 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Параметризация функций в Python

Параметризация функций — это способы передачи данных и конфигурации в функцию для изменения её поведения. Расскажу о всех основных способах, которые используются в промышленной разработке.

1. Позиционные аргументы

def add(a, b, c):
    return a + b + c

# Параметры передаются по позиции
result = add(1, 2, 3)  # 1 — a, 2 — b, 3 — c
print(result)  # 6

Плюсы:

  • Просто и понятно для небольшого числа параметров

Минусы:

  • Легко спутать порядок
  • Сложно читать при большом числе параметров

2. Именованные аргументы (keyword arguments)

def create_user(name, email, age, is_active=True):
    return {"name": name, "email": email, "age": age, "active": is_active}

# Параметры передаются по имени
user = create_user(name="Alice", email="alice@example.com", age=30)
print(user)
# {"name": "Alice", "email": "alice@example.com", "age": 30, "active": True}

# Порядок не важен
user2 = create_user(age=25, name="Bob", email="bob@example.com")

Плюсы:

  • Код очень читаемый
  • Порядок не имеет значения
  • Легко добавлять новые параметры

Минусы:

  • Больше символов при вызове

3. Аргументы со значениями по умолчанию

def fetch_data(url, timeout=30, retries=3, verify_ssl=True):
    print(f"Fetching {url} with timeout={timeout}, retries={retries}")
    # Логика

# Используем дефолты
fetch_data("https://api.example.com/users")

# Переопределяем только нужные
fetch_data("https://api.example.com/users", timeout=60)
fetch_data("https://api.example.com/users", timeout=60, retries=5)

Правило: параметры со значениями по умолчанию должны быть в конце.

4. *args (переменное число позиционных аргументов)

def sum_all(*numbers):
    return sum(numbers)

print(sum_all(1, 2, 3))           # 6
print(sum_all(1, 2, 3, 4, 5))    # 15

# *args становится кортежом
def print_all(*items):
    for item in items:
        print(item)

print_all("a", "b", "c")  # Выводит a, b, c по строкам

# Используется в декораторах
def decorator(func):
    def wrapper(*args, **kwargs):  # Принимаем любые параметры
        print(f"Calling {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

5. **kwargs (переменное число именованных аргументов)

def create_filter(**conditions):
    # **kwargs становится словарём
    return {"filters": conditions}

result = create_filter(status="active", age__gte=18, country="RU")
print(result)
# {"filters": {"status": "active", "age__gte": 18, "country": "RU"}}

# Часто используется в конструкторах
class User:
    def __init__(self, name, email, **extra):
        self.name = name
        self.email = email
        self.extra = extra  # Любые дополнительные поля

user = User("Alice", "alice@example.com", phone="123", address="Moscow")
print(user.extra)  # {"phone": "123", "address": "Moscow"}

6. Комбинирование *args и **kwargs

def flexible_function(a, b, *args, **kwargs):
    print(f"a={a}, b={b}")
    print(f"args={args}")  # Кортеж: (3, 4, 5)
    print(f"kwargs={kwargs}")  # Словарь: {"x": 10, "y": 20}

flexible_function(1, 2, 3, 4, 5, x=10, y=20)
# a=1, b=2
# args=(3, 4, 5)
# kwargs={"x": 10, "y": 20}

# Пример: логирование
def log_and_execute(func, *args, **kwargs):
    print(f"Executing {func.__name__} with args={args}, kwargs={kwargs}")
    return func(*args, **kwargs)

7. Только позиционные параметры (/)

# Python 3.8+
def divide(a, b, /):
    """a и b могут передаваться ТОЛЬКО позиционно"""
    return a / b

divide(10, 2)        # ✓ OK
# divide(a=10, b=2)  # ✗ TypeError

8. Только именованные параметры (*)

def config(name, *, debug=False, timeout=30):
    """debug и timeout ТОЛЬКО именованные"""
    return {"name": name, "debug": debug, "timeout": timeout}

config("myapp", debug=True, timeout=60)  # ✓ OK
# config("myapp", True, 60)  # ✗ TypeError

9. Type hints для параметризации

from typing import List, Dict, Optional, Callable

def process_items(
    items: List[str],
    formatter: Callable[[str], str] = str.upper,
    metadata: Optional[Dict[str, str]] = None
) -> List[str]:
    """Типизированная функция с явными типами параметров"""
    result = [formatter(item) for item in items]
    if metadata:
        print(f"Metadata: {metadata}")
    return result

process_items(["hello", "world"], metadata={"source": "user"})

10. Dataclasses и Pydantic для структурированной параметризации

from dataclasses import dataclass
from pydantic import BaseModel, Field

# Dataclass
@dataclass
class UserConfig:
    name: str
    email: str
    age: int = 18
    roles: list = None

config = UserConfig(name="Alice", email="alice@example.com")
print(config)

# Pydantic для валидации
class CreateUserRequest(BaseModel):
    name: str
    email: str
    age: int = Field(ge=0, le=150)  # Валидация: 0 <= age <= 150

request = CreateUserRequest(name="Bob", email="bob@example.com", age=25)
print(request.model_dump())  # Сериализация

11. Partial функции (functools.partial)

from functools import partial

def power(base, exponent):
    return base ** exponent

# Зафиксируем exponent=2
square = partial(power, exponent=2)

print(square(3))  # 3^2 = 9
print(square(5))  # 5^2 = 25

# Используется в callbacks
button.on_click(partial(save_data, filename="data.json"))

12. Конфиг объекты (Configuration Objects)

class DatabaseConfig:
    def __init__(self, host, port, database, user, password):
        self.host = host
        self.port = port
        self.database = database
        self.user = user
        self.password = password

class Database:
    def __init__(self, config: DatabaseConfig):
        self.config = config
    
    def connect(self):
        print(f"Connecting to {self.config.host}:{self.config.port}")

# Вместо множества параметров
db_config = DatabaseConfig(
    host="localhost",
    port=5432,
    database="mydb",
    user="admin",
    password="secret"
)
db = Database(db_config)

Резюме: выбор метода параметризации

МетодКогда использоватьПример
Позиционные1-2 параметраadd(1, 2)
Именованные3+ параметраcreate_user(name="A", email="a@b.com")
*argsНеизвестное число параметровsum_all(1, 2, 3, 4)
**kwargsГибкая конфигурацияUser(**data_dict)
Type hintsЛюбые параметрыВсегда использовать
Dataclass/PydanticСтруктурированные параметрыAPI requests
PartialФиксация части параметровCallbacks, decorators

Профессиональный код использует комбинацию методов для максимальной гибкости и читаемости.

Какие знаешь способы параметризации функции? | PrepBro