⚫️ query() и eval() в pandas: красиво, но не всегда безопасно
Ты в ноутбуке, руки летят по клавиатуре, и тут — бах:df.query("revenue > 1000 and region == 'south'")
Красиво. Читаемо. Почти как SQL. В проде бы тоже так... но стоп.
▪️ В Jupyter — это магия:
— меньше скобок,
— больше читабельности,
— быстро собрать фильтр “на лету”.
▪️ А вот в проде — уже не так весело:
— строка-выражение ломается при переименовании колонок,
— eval не ловит синтаксис до выполнения (лови баг в рантайме),
— query паникует, если внутри переменная с пробелом,
— да и никакой тебе защиты от инъекций.
▪️ Что важно помнить:
— query() и eval() шикарны для эксплора в ноутбуке
— но для ETL, API и пайплайнов — выбирай надёжность: обычные фильтры, .loc и .apply
— безопасность важнее синтаксического кайфа
Если твой код идёт в прод, лучше быть занудой, чем героем с eval в рукаве.
query() и eval() делают код короче, а ошибки — тише
Например пишешь ты ноутбук, хочешь быстро отфильтровать DataFrame и…
либо лепишь df[(df['col1'] == x) & (df['col2'] > y)],
либо пишешь красиво, по-людски:df.query("col1 == @x and col2 > @y")
▪️ Почему это удобно?
query() и eval() дают стиль “почти SQL”:
— читабельно,
— компактно,
— близко к бизнес-языку.
Плюс — меньше скобок, меньше боли. Особенно в анализе и ноутбуках.
▪️Но есть нюансы
1. eval() ≠ весь Python
Под капотом — numexpr, он быстрый, но не умеет всё.
Например:df.eval("segment == 'premium'") # может упасть
Решение? — Явно пиши условия:(df["segment"] == "premium").astype(int) * 50
2. .query() и переменные
f-строки в фильтрах — путь к багам (и, потенциально, SQL-инъекциям):df.query(f"country == '{val}'")
Вместо этого:df.query("country == @val")
@ — экранирует и вставляет безопасно.
▪️ Где это реально полезно:
• Быстрый фильтр в ноутбуке
• Читаемый отчёт для тимлида
• Прототип перед автоматизацией
• Скрининг выгрузки “на глаз”
▪️А вот в проде — не спеши:
• f-строки → баги
• непредсказуемость eval
• сложная логика — лучше через .loc, .apply, .pipe
📌 Вывод:
query() и eval() — это как маркер в тетрадке. Для заметок и черновиков — кайф.
Но на финальный отчёт лучше взять шариковую ручку 😉
👉 Senior Data Analyst | #python