Вы проектируете функцию для аналитического трекинга: обязательны имя события, идентификатор пользователя и время, а дополнительные поля бывают редко и непредсказуемы. Какой дизайн наиболее читаемый и удобный?
A
def track_event(**kwargs): ... со всеми полями в словаре, включая обязательныеB
def track_event(event_name, user_id, timestamp, **kwargs): ... с явными ключевымиC
def track_event(): ... со сборкой полей внутри тела через глобальный контекстD
def track_event(event_name, *args, **kwargs): ... с обязательным только именемПравильный ответ. Ключевые обязательные параметры лучше делать явными, а «опциональные метаданные» собирать через
**kwargs.Разбор
Если обязательные параметры важны для понимания кода, их стоит прописать явно в сигнатуре: так легче читать, есть автодополнение в IDE, меньше ошибок при вызове. При этом дополнительные редкие поля удобно принимать через **kwargs как словарь метаданных. Полностью «всё через **kwargs» ухудшает читаемость и усложняет контроль входных данных, а пустая сигнатура с глобальным контекстом — антипаттерн.
Проверь себя · 1/3разбор после ответа
Дана функция
def add(a, b, c): return a + b + c и список nums = [1, 2, 3]. Что вернёт вызов add(*nums)?Ещё вопросы по теме «Функции и аргументы»
- Есть функция `def add(x, y): return x + y`. Что вернет вызов `add(2, 3)`?
- Дана функция `def f(a, b, c): return a * 100 + b * 10 + c`. Что вернёт вызов `f(1, c=3, b=2)`?
- Есть функция `def power(x, exp=2): return x ** exp`. Что вернёт вызов `power(3)`?
- Дана функция `def total(*args): return sum(args)`. Что вернёт вызов `total(1, 2, 3)`?
- Дан код: `x = 10` на верхнем уровне модуля и `def inc(): return x + 1`. Что вернёт вызов `inc()`?
- Все вопросы по «Функции и аргументы» →