Zen of Python
20.1K subscribers
1.25K photos
168 videos
32 files
3.21K links
Полный Дзен Пайтона в одном канале

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/xZOL
Download Telegram
​​tabulate | pretty-printed-таблицы в CLI

Библиотека сделает вывод датафрейма в консоль красивой. Поддерживает множество типов итерируемых объектов, может стилизовать вывод под GitHub, PSQL, LaTeX, Jira и проч. Самое оно для красоты в Google Colab.

#инструмент
@zen_of_python
🔥5👍3
Про with

with позволяет обернуть выполнение блока кода в так называемый контекстный менеджер, который автоматически управляет ресурсами. Это особенно полезно для операций, требующих явного освобождения ресурсов, таких как работа с файлами, сетевыми соединениями или базами данных:


with open('example.txt', 'r') as file:
content = file.read()
print(content)


В этом примере файл автоматически закроется после выхода из блока, даже если в процессе чтения произойдет исключение.


Как работает?

Оператор работает с объектами, реализующими протокол контекстного менеджера, то есть имеющими методы:

🔘__enter__(): выполняется при входе в блок with. Готовит ресурс и возвращает его;
🔘__exit__(): выполняется при выходе из блока. Отвечает за очистку ресурса, например, закрытие файла.


Примеры использования

Взаимодействие с базой данных:


import sqlite3

with sqlite3.connect('example.db') as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
print(cursor.fetchall())


Соединение с базой данных будет автоматически закрыто, даже если запрос вызовет исключение.


Зачем нужен with

🔘Гарантирует, что ресурсы будут освобождены после использования;
🔘Устраняет необходимость в явных блоках try / finally;
🔘Позволяет корректно обрабатывать исключения и освобождать ресурсы даже в случае ошибок;
🔘Повышение читаемости.

#основы
@zen_of_python
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31👨‍💻1
Как тестировать перенос и трансформацию данных без боли

В статье на Tproger представили практичный и понятный подход к тестированию ETL-процессов с использованием Python, Pytest и фикстур. Автор — Data QA, поделилась опытом автоматизации создания и наполнения таблиц, хранением схем и данных в JSON, а также сравнением результатов до и после трансформации.

Проект с минимальным стеком — pytest, allure и psycopg2. Статья будет полезна разработчикам и тестировщикам.

#основы
@zen_of_python
👍2
Как динамически изменять исходный код функций

В статье «Wicked Python Trickery» Эрик Ма делится необычным и мощным методом динамической модификации исходного кода функций во время выполнения программы.


Что за трюк?

В Python каждая функция имеет атрибут .__code__, который представляет собой объект байткода. Используя функции compile() и exec(), можно создать новый исходный код функции, скомпилировать его в байткод и выполнить в нужном пространстве имён. Это позволяет заменить поведение функции без её явного переопределения:


def something():
raise NotImplementedError()

new_code = """
def something(x: int) -> int:
return x * 2
"""

compiled = compile(new_code, "<magic>", "exec")
ns = {}
exec(compiled, {}, ns)

something_new = ns["something"]
print(something_new(21)) # Выведет 42


Здесь мы создаём новый исходный код функции something, компилируем его и выполняем в пустом пространстве имён. Затем извлекаем новую функцию из этого пространства и вызываем её.


Практическое применение

Эрик использовал этот метод для создания бота, который выбирает инструменты для выполнения, но не выполняет их сам. Вместо этого он генерирует Python-функции на лету, которые имеют доступ ко всем глобальным переменным текущего сеанса. Это позволяет создавать гибкие и мощные инструменты без необходимости заранее определять все возможные функции.

Этот подход позволяет LLM (Large Language Model) генерировать код, который может использовать текущие данные и функции, доступные в глобальном пространстве имён.


Риски безопасности

Однако такой подход сопряжён с серьёзными рисками. Выполнение сгенерированного кода без должной проверки может привести к выполнению вредоносных действий, таких как удаление файлов, утечка данных или атаки на внешние сервисы. Эрик отметил, что в текущей реализации отсутствует защита от таких угроз, и планирует использовать инструменты, такие как Restricted Python, для ограничения возможностей выполняемого кода.

#факт
@zen_of_python
4😱2👎1