#python python... PYTHON 🔛 🚀
11 subscribers
914 photos
7 videos
158 files
1.54K links
Download Telegram
Создание временных файлов

В процессе написания скрипта может потребоваться создание временных файлов, которые будут удалены автоматически после завершения работы скрипта или обработки файла.
Это может быть полезно по разным причинам - при обработке больших данных (которые не вместятся в буфер) или при проведении сложных операций (например, можно создать временный файл и натравить на него ffmpeg).

Для решения этих проблем в Python есть модуль tempfile. Нас интересует 2 функции - это TemporaryFile и NamedTemporaryFile.

TemporaryFile позволяет создать безымянный временный файл. Вот так можно создать временный текстовой файл, открыть его на запись и чтение (за это отвечает первый аргумент "w+t", подробнее можно прочитать здесь):

from tempfile import TemporaryFile
with TemporaryFile("w+t") as t:
t.write("Hello, boxwithpython!")
t.seek(0)
data = t.read()

NamedTemporaryFile используется для более продвинутых сценариев, так как он создает файл с именем, поэтому мы можем получить путь к нему и использовать его для дальнейших целей:

from tempfile import 
NamedTemporaryFile
with NamedTemporaryFile("w+t") as t:
t.write("Hello, boxwithpython!")
print(t.name) # /tmp/tmpljhsktjt

#std
Про __slots__

Python, аналогично другим динамическим языкам, таким как JavaScript, предоставляет возможность манипулирования объектами в рантайме, в том числе позволяет добавлять, изменять и удалять атрибуты. Цена этого – понижение скорости доступа к атрибутам и дополнительные расходы памяти.

Такое поведение нужно не всегда. Бывают случаи, когда мы точно знаем, какие атрибуты будут у наших экземпляров классов. Или же мы хотим ограничить добавление новых атрибутов. Именно для этого и существует __slots__.

Слоты задаются через атрибут __slots__ в классе:

class SlotsClass:
slots = ('foo', 'bar')

>>> obj = SlotsClass()
>>> obj.foo = 5
>>> obj.foo
# 5
>>> obj.another_attribute = 'test'
Traceback (most recent call last):
File "python", line 5, in <module>
AttributeError: 'SlotsClass' object has no attribute 'another_attribute'

Теперь мы не можем добавлять новые атрибуты к нашим объектам. Скорость доступа к атрибутам повышается на 25-30%, потому что при доступе к ним их больше не надо вычислять.
В свою очередь, память экономится из-за того, что у класса не создается __dict__, который как раз хранил атрибуты.

#std #slots
Коробка с питоном
Про __slots__ Python, аналогично другим динамическим языкам, таким как JavaScript, предоставляет возможность манипулирования объектами в рантайме, в том числе позволяет добавлять, изменять и удалять атрибуты. Цена этого – понижение скорости доступа к атрибутам…
__slots__ и наследование

Важно помнить, что при попытке унаследовать класс с __slots__ подкласс их унаследует, но так же и создаст __dict__ для новых атрибутов:

class SlotsClass:
__slots__ = ('foo', 'bar')

class ChildSlotsClass(SlotsClass):
pass

>>> obj = ChildSlotsClass()
>>> obj.__slots__
# ('foo', 'bar')
>>> obj.foo = 5
>>> obj.test = 3
>>> obj.__dict__
# {'test': 3}

Это стандартное и понятное поведение. Чтобы избежать создания __dict__, можно снова переопределить __slots__ в подклассе:

class SlotsClass:
__slots__ = ('foo', 'bar')

class ChildSlotsClass(SlotsClass):
__slots__ = ('baz',)

>>> obj = ChildSlotsClass()
>>> obj.foo = 5
>>> obj.baz = 6
>>> obj.something_new = 3

AttributeError: 'ChildSlotsClass' object has no attribute 'something_new'

А что с множественным наследованием?

class ClassA:
__slots__ = ('foo', 'bar',)

class ClassB:
__slots__ = ('baz',)

class C(ClassA, ClassB):
pass

TypeError: multiple bases have instance lay-out conflict

Оно не работает. Потому-что каждый класс может иметь свои собственные __slots__, которые могут пересекаться с другими классами, а это может привести к тому, что объекты могут быть созданы неправильно или будут иметь непредсказуемое поведение.
Из-за этого возникает неоднозначность, какой именно слот использовать в результирующем классе.

#std #slots
Forwarded from Data Whisperer
Python, как швейцарский нож.
Forwarded from DE
🖼️ Загадка

t = (1, 2, [3, 4])
t[2] += [5, 6]
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from DE
Опросы в телеге не поддерживают форматирование кода, дублирую код для проверки:

t = (1, 2, [3, 4])
try:
t[2] += [5, 6]
except TypeError as err:
print(err)
print(t)


Это патология Python.
Из такого примера ты можешь сделать следующие выводы:

1️⃣ Не помещай изменяемые элементы в кортежи.
2️⃣ Составное присваивание -- не атомарная операция
3️⃣ Иногда следует изучать байт-код, чтобы понять, что происходит под капотом


Удобный ресурс для пошагового исполнения кода с визуализацией - pythontutor.com

#python #quiz #blowmymind
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from DE
🖼️
И в дополнение к патологии выше, есть целый репозиторий с подобными штуками - ссылка

#python #wtfpython
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from DE
🖥 Python-разработчики подверглись сложной атаке на цепочку поставок

Аналитики компании Checkmarx сообщили, что после загрузки вредоносного клона популярной утилиты Colorama несколько Python-разработчиков, включая сопровождающего Top.gg, оказались заражены малварью, похищающей информацию. По мнению специалистов, основной целью кампании, скорее всего, была кража данных и их последующая монетизация.

Атака началась аж в ноябре 2022 года, когда хакеры впервые загрузили вредоносные пакеты в Python Package Index (PyPI). В последующие годы на PyPI было добавлено еще больше пакетов с малварью. Все они были похожи на популярные опенсорсные инструменты, что повышало вероятность их попадания в результаты поисковых систем.

Утилита Colorama, которую в числе прочих подделали злоумышленники, обеспечивает работу последовательностей символов ANSI в Windows и в настоящее время насчитывает более 150 млн загрузок ежемесячно.

Чтобы организовать атаку на цепочку поставок, хакеры клонировали эту утилиту, внедрили в нее вредоносный код и разместили вредоносную версию на поддельном домене. Благодаря тому, что атакующие использовали тайпсквоттинг, сайт хакеров (files.pypihosted[.]org) походил на легитимное зеркало files.pythonhosted.org.

Для распространения вредоносного пакета злоумышленники не только создали вредоносные репозитории под собственными учетными записями, но также взломали ряд известных аккаунтов. В их числе был GitHub-аккаунт editor-syntax, поддерживающий платформу для поиска и обнаружения серверов, ботов и других социальных инструментов в Discord, Top.gg, сообщество которой насчитывает более 170 000 участников.

Аккаунт, скорее всего, был взломан через украденные cookies, которые злоумышленники использовали для обхода аутентификации и выполнения вредоносных действий, при этом не зная пароля аккаунта. В результате взлома пострадали несколько членов сообщества Top.gg.

📎 Читать подробнее
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Dmitry Kosarevsky
попробуй такое, сам не читал, но говорят норм
Forwarded from DE
Если тебе интересно заглянуть под капот Python и узнать, как устроены списки - есть отличная статья, которая начинается с достаточно простого примера и потом плавно погружает в глубины C-шной реализации списков в Python.

Автор статьи серьёзно подошёл к делу: он не только детально всё расписал, но и приложил кучу наглядных иллюстраций.

Даже если ты никогда не программировал на C, тебе будет понятен и интересен материал.

Ссылка на статью, рекомендую ознакомиться — это на самом деле увлекательно 🙂

#python
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from DE
И ещё немного про Python.

Полезно тем, кто уже освоился с f-строками в Python и использует их для форматирования. Часто ты останавливаешься на чём-то вроде f"string {variable}", но знаешь ли ты, что f-строки скрывают в себе гораздо больше возможностей?

Например, представь, что тебе нужно превратить число в строку, где оно всегда будет занимать три позиции, дополняясь нулями спереди, если это необходимо. С f-строками это сделать проще простого! Если у тебя число 5, ты получишь "005", а если 123, то останется просто "123".

Гайд от PyBites показывает, на что способны f-строки. Если ты ещё не раскрыл для себя все возможности этого удобного инструмента - бегом читать 🙃

Ссылка

А ещё по f-строкам у меня была ссылка на другой хороший материал в посте

#python
Please open Telegram to view this post
VIEW IN TELEGRAM
🔍 Как использовать инструменты статического анализа в коде Python

За последние несколько лет статические анализаторы кода значительно оптимизировали разработку приложений. Статический анализ избавляет от необходимости отыскивать ошибки и уязвимости в системе продакшн или среде развертывания, указывая участок предполагаемого сбоя на основе типизации и других подсказок кода.

В статье мы подробно разберем несколько инструментов статического анализа с открытым ПО для Python. Посмотрим, как они работают и улучшают процесс программирования.

Читать

@data_analysis_ml
Please open Telegram to view this post
VIEW IN TELEGRAM
import sqlite3
from functools import wraps

def create_cache_table():
conn = sqlite3.connect("cache.db")
c = conn.cursor()
c.execute("CREATE TABLE IF NOT EXISTS cache (input text, output text)")
conn.commit()
conn.close()

def drop_cache_table():
conn = sqlite3.connect("cache.db")
c = conn.cursor()
c.execute("DROP TABLE IF EXISTS cache")
conn.commit()
conn.close()

def store_in_cache(input, output):
create_cache_table()
conn = sqlite3.connect("cache.db")
c = conn.cursor()
c.execute("INSERT INTO cache VALUES (?,?)", (input, output))
conn.commit()
conn.close()

def retrieve_from_cache(input):
create_cache_table()
conn = sqlite3.connect("cache.db")
c = conn.cursor()
c.execute("SELECT output FROM cache WHERE input=?", (input,))
result = c.fetchone()
conn.close()
if result:
return result[0]
return None

def cache(func):
@wraps(func)
def wrapper(input):
output = retrieve_from_cache(input)
if output is not None:
print("# from cache: ", end='\t')
return output
else:
print("# new question: ", end='\t')
output = func(input)
store_in_cache(input, output)
return output
return wrapper

@cache
def get_answer(input):
ai_dict = {
"who are you" : "stupid algorithm)",
"2 + 2": '4',
}
return '\t'*3 + ai_dict.get(input, "I don't khow
🤷‍♂️")

def test():
drop_cache_table()
test_ai_qsts = [
"who are you",
"2 + 2",
"who are you",
"ok"
]
for q in test_ai_qsts:
print(
q, get_answer(q),
sep=' -> \n',
)

if __name__ == '__main__':
test()


@getcher полный код кэширования ответов
Forwarded from DataEng
100 самых популярных Python докладов

Нашел в сети подборку из 100 самых просматриваемых докладов про Python: 100 most-watched Python 2023 conference talks ordered by the number of views
Среди этих докладов популярны темы про Rust, data engineering и оптимизацию производительности.

К слову, PyCon US 2024 уже прошел, но в открытом доступе до сих пор нет докладов. Надеюсь на их скорое появление, т.к. там есть на что посмотреть.
Simplifying the Python Code for Data Engineering Projects
Оригинальная статья (10 min read)

Стоит прочитать или нет? Сделали краткое содержание 🙌


Статья исследует различные техники и лучшие практики для повышения эффективности и читаемости кода на Python в проектах по обработке данных. Она охватывает важные аспекты, такие как ввод данных, их проверка, обработка и тестирование конвейера, используя встроенные функции и библиотеки Python.

Ввод данных
📌 Использование yield для обработки больших наборов данных: yield позволяет создавать генераторы, которые возвращают по одному элементу за раз вместо загрузки всех данных в память. Это особенно полезно при работе с большими наборами данных, так как позволяет экономить память и ускорять процесс обработки данных.

📌 Обработка данных частями: Вместо того чтобы загружать все данные сразу, можно обрабатывать их порциями (batch processing). Это помогает избежать проблем с памятью и позволяет начать обработку данных до завершения их полной загрузки.

Проверка данных
📌 Использование библиотеки Pydantic для проверки полей данных: Pydantic позволяет определить схему данных с использованием моделей Python. Эти модели используются для проверки данных на соответствие заданным правилам и форматам, что помогает обеспечить их целостность и точность.

📌 Реализация пользовательских правил проверки: Pydantic поддерживает создание пользовательских валидаторов, которые могут проверять значения полей на соответствие определенным критериям (например, допустимым значениям платежных методов). Это позволяет дополнительно контролировать качество данных.

Обработка данных
📌 Применение декораторов Python для измерения времени выполнения: Декораторы позволяют оборачивать функции дополнительным функционалом без изменения их исходного кода. Например, можно создать декоратор для измерения времени выполнения функций, что помогает выявлять узкие места и оптимизировать производительность.

📌 Использование функциональных методов программирования (map, filter, reduce):
- map применяется для выполнения одной и той же операции над всеми элементами списка (например, добавление суффикса к значениям платежных методов).
- filter позволяет отфильтровать элементы списка, которые соответствуют определенным условиям (например, оставить только записи с платежным методом "Cryptocurrency").
- reduce используется для получения единственного значения из списка (например, суммирование всех значений).

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

📌 Проверка качества выходных данных и обнаружение ошибок: Тестирование помогает выявлять логические ошибки и несоответствия на ранних стадиях разработки. Это особенно важно для сложных конвейеров данных, где ошибки могут быть трудно обнаружимыми.

Лучшие практики
📌 Поддержка ясного и модульного кода:
Структурированный и модульный код облегчает его понимание, поддержку и масштабирование. Разделение кода на логические модули и функции помогает управлять сложностью проекта.

📌 Интеграция тестирования и проверки данных: Тестирование и проверка данных должны быть неотъемлемой частью рабочего процесса. Это помогает обеспечить высокое качество данных и надежность работы системы в целом.


#почитать
На днях мне подкинули интересный канал https://t.me/press_any_button , рекомендую присмотреться, особенно начинающим разработчикам 🐍

Авторы публикуют различные гайды по python, разработке на django, использованию docker, написанию ботов с aiogram и по другим темам. Так же разбирают различные задачи на python. Описание контента в одном посте можно посмотреть тут https://t.me/press_any_button/738 👈

Для тех кто только начинает своей погружение в мир разработки, рекомендую начать читать канал с самых первых постов, можно последовательно пройти через уроки разработки сайтов с самого нуля 🎓, если вам подходит django.