← Назад к вопросам
Какие знаешь способы параметризации функции?
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 |
Профессиональный код использует комбинацию методов для максимальной гибкости и читаемости.