Положил прод на полчаса одним дефолтным аргументом. Python который мы заслужили
Рейтинг: 51% · 4 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
Положил прод на полчаса одним дефолтным аргументом. Python который мы заслужили
Каюсь и делюсь, чтобы хоть кому-то сэкономить нервы. Сервис на FastAPI, поиск по каталогу. В хелпере сигнатура def apply_filters(query, extra=[]). Внутри в одной ветке extra.append(фильтр по региону юзера).
Кто знает, тот уже смеётся. Дефолтный список создаётся один раз и живёт между вызовами. Фильтры копились от запроса к запросу, и юзеры начали получать выдачу с чужими региональными фильтрами. Саппорт завален, мы полчаса ищем призрака, потому что локально не воспроизводится (воркер-то свежий).
Про mutable default я знаю со времён первых туториалов. На собесах сам спрашивал. И всё равно в ревью проскочило. Итог: ruff с правилом B006 теперь в CI блокирующий, без него мердж не проходит.
Кто знает, тот уже смеётся. Дефолтный список создаётся один раз и живёт между вызовами. Фильтры копились от запроса к запросу, и юзеры начали получать выдачу с чужими региональными фильтрами. Саппорт завален, мы полчаса ищем призрака, потому что локально не воспроизводится (воркер-то свежий).
Про mutable default я знаю со времён первых туториалов. На собесах сам спрашивал. И всё равно в ревью проскочило. Итог: ruff с правилом B006 теперь в CI блокирующий, без него мердж не проходит.
✔ Лучший ответ сформирован автоматически — rawgoblin
Для тех кто не понял почему так: дефолты вычисляются один раз в момент def, это документированное поведение, а не баг. Был PEP 671 про late-bound defaults со синтаксисом =>, так и лежит без принятия уже который год, потому что обратная совместимость и споры о синтаксисе. Так что живём как живём.
Re: Положил прод на полчаса одним дефолтным аргументом. Python который мы заслужили
У меня было тоньше: def log_event(payload, ts=datetime.now()). Время вычислилось один раз при импорте модуля. Неделю все события писались одним таймстемпом, аналитики потом неделю восстанавливали отчёты. Никакой линтер тогда не стоял, 2022 год, молодые были.
Re: Положил прод на полчаса одним дефолтным аргументом. Python который мы заслужили
✔ Лучший ответ — сформирован автоматически
Для тех кто не понял почему так: дефолты вычисляются один раз в момент def, это документированное поведение, а не баг. Был PEP 671 про late-bound defaults со синтаксисом =>, так и лежит без принятия уже который год, потому что обратная совместимость и споры о синтаксисе. Так что живём как живём.
Re: Положил прод на полчаса одним дефолтным аргументом. Python который мы заслужили
@sepiatone, ruff B006 плюс B008 ставьте парой. B008 как раз ловит вызовы в дефолтах типа того datetime.now() выше, и кстати знает про fastapi Depends чтобы не орать зря.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
-
- JetBrains положил Junie во все подписки All Products. Кто уже гонял против Claude Code?
4 ответов · 6 просмотров
-
-
- Cloudflare лег на 3 часа и положил пол интернета, опять single point of failure
7 ответов · 1 просмотров
-
Кто сейчас на конференции
Сейчас этот форум просматривают: Yandex [Bot] и 1 гость