Положил прод на полчаса одним дефолтным аргументом. Python который мы заслужили

Рейтинг: 51% · 4 голосов
Python, Rust, Go, C++, C#, Java, Kotlin: синтаксис, паттерны проектирования, производительность, многопоточность и сравнение языков.
Ответить
Аватара пользователя
lrichard
Сообщения: 19
Зарегистрирован: 12 май 2026, 17:46

Положил прод на полчаса одним дефолтным аргументом. Python который мы заслужили

Сообщение lrichard »

Каюсь и делюсь, чтобы хоть кому-то сэкономить нервы. Сервис на FastAPI, поиск по каталогу. В хелпере сигнатура def apply_filters(query, extra=[]). Внутри в одной ветке extra.append(фильтр по региону юзера).

Кто знает, тот уже смеётся. Дефолтный список создаётся один раз и живёт между вызовами. Фильтры копились от запроса к запросу, и юзеры начали получать выдачу с чужими региональными фильтрами. Саппорт завален, мы полчаса ищем призрака, потому что локально не воспроизводится (воркер-то свежий).

Про mutable default я знаю со времён первых туториалов. На собесах сам спрашивал. И всё равно в ревью проскочило. Итог: ruff с правилом B006 теперь в CI блокирующий, без него мердж не проходит.
👍 ❤️ 🔥 😄 🤔
✔ Лучший ответ сформирован автоматически — rawgoblin
Для тех кто не понял почему так: дефолты вычисляются один раз в момент def, это документированное поведение, а не баг. Был PEP 671 про late-bound defaults со синтаксисом =>, так и лежит без принятия уже который год, потому что обратная совместимость и споры о синтаксисе. Так что живём как живём.
Перейти к ответу →
Аватара пользователя
sepiatone
Сообщения: 30
Зарегистрирован: 20 май 2026, 09:19

Re: Положил прод на полчаса одним дефолтным аргументом. Python который мы заслужили

Сообщение sepiatone »

лол, классика жанра. фокусу двадцать лет, он в каждом списке вопросов для джунов, и всё равно регулярно кладёт проды. питон неизменен
👍 ❤️3 🔥1 😄 🤔
Аватара пользователя
kotlin123
Сообщения: 46
Зарегистрирован: 12 май 2026, 14:33

Re: Положил прод на полчаса одним дефолтным аргументом. Python который мы заслужили

Сообщение kotlin123 »

вопрос вообще не к питону. как append к входному аргументу прошёл ревью? мутировать параметр функции это само по себе красный флаг, хоть с дефолтом хоть без
👍1 ❤️ 🔥1 😄1 🤔
Аватара пользователя
wasmsre
Сообщения: 13
Зарегистрирован: 11 май 2026, 03:17

Re: Положил прод на полчаса одним дефолтным аргументом. Python который мы заслужили

Сообщение wasmsre »

У меня было тоньше: def log_event(payload, ts=datetime.now()). Время вычислилось один раз при импорте модуля. Неделю все события писались одним таймстемпом, аналитики потом неделю восстанавливали отчёты. Никакой линтер тогда не стоял, 2022 год, молодые были.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
rawgoblin
Сообщения: 39
Зарегистрирован: 13 май 2026, 07:42

Re: Положил прод на полчаса одним дефолтным аргументом. Python который мы заслужили

Сообщение rawgoblin »

✔ Лучший ответ — сформирован автоматически
Для тех кто не понял почему так: дефолты вычисляются один раз в момент def, это документированное поведение, а не баг. Был PEP 671 про late-bound defaults со синтаксисом =>, так и лежит без принятия уже который год, потому что обратная совместимость и споры о синтаксисе. Так что живём как живём.
👍 ❤️1 🔥1 😄 🤔
Аватара пользователя
ceph7
Сообщения: 33
Зарегистрирован: 13 май 2026, 08:39

Re: Положил прод на полчаса одним дефолтным аргументом. Python который мы заслужили

Сообщение ceph7 »

полчаса на такое это вы ещё быстро. но ваще канарейка или хотя бы алерт на аномалии в выдаче нашли бы это за пять минут, у вас с обвязкой беда а не с питоном
👍1 ❤️ 🔥1 😄 🤔
Аватара пользователя
mgyorko
Сообщения: 7
Зарегистрирован: 12 май 2026, 19:04

Re: Положил прод на полчаса одним дефолтным аргументом. Python который мы заслужили

Сообщение mgyorko »

@sepiatone, ruff B006 плюс B008 ставьте парой. B008 как раз ловит вызовы в дефолтах типа того datetime.now() выше, и кстати знает про fastapi Depends чтобы не орать зря.
👍 ❤️ 🔥1 😄1 🤔
Ответить
Поделиться темой: ✈ Telegram VK

Вернуться в «Языки программирования»

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и 1 гость