June 25

⚫️ 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