tabulate | pretty-printed-таблицы в CLI
Библиотека сделает вывод датафрейма в консоль красивой. Поддерживает множество типов итерируемых объектов, может стилизовать вывод под GitHub, PSQL, LaTeX, Jira и проч. Самое оно для красоты в Google Colab.
#инструмент
@zen_of_python
Библиотека сделает вывод датафрейма в консоль красивой. Поддерживает множество типов итерируемых объектов, может стилизовать вывод под GitHub, PSQL, LaTeX, Jira и проч. Самое оно для красоты в Google Colab.
#инструмент
@zen_of_python
🔥5👍3
Про
В этом примере файл автоматически закроется после выхода из блока, даже если в процессе чтения произойдет исключение.
Как работает?
Оператор работает с объектами, реализующими протокол контекстного менеджера, то есть имеющими методы:
🔘
🔘
Примеры использования
Взаимодействие с базой данных:
Соединение с базой данных будет автоматически закрыто, даже если запрос вызовет исключение.
Зачем нужен with
🔘 Гарантирует, что ресурсы будут освобождены после использования;
🔘 Устраняет необходимость в явных блоках
🔘 Позволяет корректно обрабатывать исключения и освобождать ресурсы даже в случае ошибок;
🔘 Повышение читаемости.
#основы
@zen_of_python
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
🔥3❤1👨💻1
Как тестировать перенос и трансформацию данных без боли
В статье на Tproger представили практичный и понятный подход к тестированию ETL-процессов с использованием Python, Pytest и фикстур. Автор — Data QA, поделилась опытом автоматизации создания и наполнения таблиц, хранением схем и данных в JSON, а также сравнением результатов до и после трансформации.
Проект с минимальным стеком — pytest, allure и psycopg2. Статья будет полезна разработчикам и тестировщикам.
#основы
@zen_of_python
В статье на Tproger представили практичный и понятный подход к тестированию ETL-процессов с использованием Python, Pytest и фикстур. Автор — Data QA, поделилась опытом автоматизации создания и наполнения таблиц, хранением схем и данных в JSON, а также сравнением результатов до и после трансформации.
Проект с минимальным стеком — pytest, allure и psycopg2. Статья будет полезна разработчикам и тестировщикам.
#основы
@zen_of_python
👍2
Как динамически изменять исходный код функций
В статье «Wicked Python Trickery» Эрик Ма делится необычным и мощным методом динамической модификации исходного кода функций во время выполнения программы.
Что за трюк?
В Python каждая функция имеет атрибут
Здесь мы создаём новый исходный код функции
Практическое применение
Эрик использовал этот метод для создания бота, который выбирает инструменты для выполнения, но не выполняет их сам. Вместо этого он генерирует Python-функции на лету, которые имеют доступ ко всем глобальным переменным текущего сеанса. Это позволяет создавать гибкие и мощные инструменты без необходимости заранее определять все возможные функции.
Этот подход позволяет LLM (Large Language Model) генерировать код, который может использовать текущие данные и функции, доступные в глобальном пространстве имён.
Риски безопасности
Однако такой подход сопряжён с серьёзными рисками. Выполнение сгенерированного кода без должной проверки может привести к выполнению вредоносных действий, таких как удаление файлов, утечка данных или атаки на внешние сервисы. Эрик отметил, что в текущей реализации отсутствует защита от таких угроз, и планирует использовать инструменты, такие как Restricted Python, для ограничения возможностей выполняемого кода.
#факт
@zen_of_python
В статье «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