This media is not supported in your browser
VIEW IN TELEGRAM
🔥 Коварная ловушка с замыканиями в Python
Многие хитрые баги в Python появляются из-за того, что разработчики неверно понимают область видимости переменных в замыканиях.
Частая ошибка - внутри цикла создавать функции-лямбды, которые «помнят» одно и то же финальное значение переменной, а не значение на каждой итерации. В итоге весь список функций ведёт себя одинаково. Чтобы избежать ловушки, фиксируйте значение через аргумент по умолчанию или используйте functools.partial.
Многие хитрые баги в Python появляются из-за того, что разработчики неверно понимают область видимости переменных в замыканиях.
Частая ошибка - внутри цикла создавать функции-лямбды, которые «помнят» одно и то же финальное значение переменной, а не значение на каждой итерации. В итоге весь список функций ведёт себя одинаково. Чтобы избежать ловушки, фиксируйте значение через аргумент по умолчанию или используйте functools.partial.
funcs = []
for i in range(5):
funcs.append(lambda x=i: x) # фиксируем i как значение по умолчанию
print([f() for f in funcs]) # [0, 1, 2, 3, 4]
👍13❤9🔥4
🌀 В Python есть встроенная функция
✓ Список можно развернуть
✓ Кортежи тоже разворачиваются
Можно итерироваться по
✓ Множества не разворачиваются
Причина: множества *не имеют порядка*, а значит разворачивать нечего.
Если нужно развернуть множество — сначала сделай его списком:
@pythonl
reversed(), но работает она не со всеми структурами данных. Быстрый разбор:✓ Список можно развернуть
reversed([1, 2, 3]) возвращает итератор. list(reversed([1, 2, 3])) → [3, 2, 1]✓ Кортежи тоже разворачиваются
Можно итерироваться по
reversed((1, 2, 3))✓ Множества не разворачиваются
reversed({1, 2, 3}) → TypeError: 'set' object is not reversible Причина: множества *не имеют порядка*, а значит разворачивать нечего.
Если нужно развернуть множество — сначала сделай его списком:
list(reversed(list({1, 2, 3})))@pythonl
❤8👍6🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 Безопасный запуск Linux-команд из Python
Если нужно из Python безопасно выполнять системные команды в Linux, используй изоляцию через
@pythonl
Если нужно из Python безопасно выполнять системные команды в Linux, используй изоляцию через
subprocess с принудительным сбросом привилегий. Такой приём позволяет запускать команды даже в окружениях с потенциально небезопасным вводом, блокируя доступ к опасным системным вызовам и снижая риск эксплуатации.
import subprocess
import os
def safe_run(cmd):
# Запускаем процесс без наследования переменных окружения
env = {"PATH": "/usr/bin:/bin"}
# Сбрасываем привилегии, если процесс запущен от root
def drop_priv():
os.setgid(65534)
os.setuid(65534)
result = subprocess.run(
cmd,
env=env,
preexec_fn=drop_priv,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
timeout=3,
)
return result.stdout
print(safe_run(["ls", "/"]))
@pythonl
❤6🔥4👍3😁2