en
Feedback

Don't get caught by a cheater! Telemetrio finds and tags such channels 👉 If you want to see the tag, subscribe

Python Заметки

Python Заметки

Open in Telegram

Интересные заметки и обучающие материалы по Python Контакт: @paulwinex ⚠️ Рекламу на канале не делаю!⚠️ Хештеги для поиска: #tricks #libs #pep #basic #regex #qt #django #2to3 #source #offtop

Show more
2 209
Subscribers
-124 hours
-17 days
+430 days
Posts Archive
Популярность имеет свои минусы. Чем популярней язык программирования, тем выше его распространённость, а значит найдутся те кто поспешит воспользоваться этим. С ростом популярности Python всё больше на PyPi появляется вредоносных пакетов. Трояны, стиллеры и доставщики более опасных вредоносов. Команда PyPi постоянно мониторит подобные случаи но и их возможности достигли предела. В результате сервис временно закрывает возможность заливки новых пакетов и регистрации юзеров. PyPI new user and new project registrations temporarily suspended Возможно одной из причин большого наплыва вредоносов является резко возросшая доступность их создания. Сегодня любой, даже не программист, может попросить у ChatGPT написать необходимый код и все инструкции для атаки. Основной тип атаки - рассчёт на опечатку в названии пакета. Если невнимательный программист случайно установит pilow или djangoo, считай что вредонос уже в системе. Чтобы избежать подобных факапов я рекомендую: ▫️ Всегда работайте в виртуальном окружении, неизвестные проекты устанавливайте внутри контейнеров. ▫️ Используйте файл requirements.txt вместо ручной установки пакетов ▫️ Очень внимательно пишите названия пакетов, а после написания проверьте еще раз. Сверьте с названием из документации. ▫️ После успешных тестов всегда фиксируйте версию пакета. Бывали случаи когда опасный код добавляли в новые версии. К тому же и без этой опасности не рекомендуется ставить по умолчанию последнюю версию. ▫️ Используйте вспомогательные инструменты для проверки безопасности, например https://pyup.io/safety или https://github.com/PyCQA/bandit. Они помогут не только найти опасный код в чужих пакетах, но и ваш код проверит на уязвимости. Будем надеяться что PyPi переосмыслит методы борьбы с вредоносами, например внедрит ИИ для проверки как симметричный шаг. #offtop

В Linux стандартными средствами можно использовать часть оперативной памяти как диск. Для этого требуется указать тип монтирования tmpfs в команде mount
mount -t tmpfs -o size=5G tmpfs /mnt/ram

Теперь путь /mnt/ram можно использовать как обычный каталог. Для чего это может быть нужно? ▫️ Скорость работы с таким каталогом выше чем многие SSD и тем более HDD. ▫️ Если у вас очень быстрый SSD на NVMe M.2 то такой способ особо не прибавит вам скорости, но поможет сохранить ресурс SSD когда требуется обрабатывать очень много мелких файлов и оперативка позволяет выделить нужный объем. ▫️ Оперативка это энергозависимая память, поэтому выключении питания все файлы безвозвратно теряются. Такой "non persistent" каталог гарантирует удаление временных файлов. Я написал небольшой скрипт для условного теста и сравнения скорости копирования файлов между SSD и RAM. Вот мои результаты:
Single File Size: 30.0Gb

ssd > ssd: 0:00:12.850 / 2.3Gb/s
sdd > ram: 0:00:06.453 / 4.6Gb/s
ram > ram: 0:00:06.995 / 4.3Gb/s
ram > sdd: 0:00:06.217 / 4.8Gb/s

Dir size: 32.7Gb, File count: 11127

ssd > ssd:  0:00:15.063 / 2.2Gb/s
sdd > ram:  0:00:08.486 / 3.9Gb/s
ram > ram:  0:00:08.032 / 4.1Gb/s
ram > sdd:  0:00:07.026 / 4.7Gb/s

Скрипт для теста ↗️ На моём железе прирост скорости ~2x. Плюс экономия ресурса SSD. В Windows такой фишки по умолчанию нет, но обязательно найдутся аналогичные решения #linux #triks

Поздравляю всех подписчиц с праздником❗️ 🌹 👠
Поздравляю всех подписчиц с праздником❗️ 🌹 👠

Как получить путь к файлу текущего класса если метод получения пути находится в родительском классе в другом файле? Например, представим такую ситуацию:
# module1.py ###

class BaseCls:
    @classmethod
    def get_path(cls):
        print(__file__)


# module2.py ###

from module1 import BaseCls

class MainCls(BaseCls):
    pass

Что покажет код:
import module2
module2.MainCls.get_path()

Мы ожидаем что путь будет к файлу module2.py, но переменная __file__ объявлена внутри файла module1.py и поэтому будет указывать именно на него. Чтобы получить правильный путь нам следует: ▫️ получить имя модуля текущего класса
module_name = module2.MainCls.__module__
▫️ найти этот модуль в списке импортированных модулей
mod = sys.modules[module_name]
▫️ получить значение переменной __file__
filepath = mod.
__file__ Вся эта процедура, причём для любого типа объекта, есть в функции inspect.getfile(). Так что наш метод должен выглядеть так:
# module1.py
import inspect

class BaseCls:
    @classmethod
    def get_path(cls):
        print(inspect.getfile(cls))

Теперь из вызов этого метода из класса MainCls найдёт путь к файлу module2.py #tricks

Вышла альфа версия Python 3.12. Можно оценить что нам готовят. Полезно глянуть что будет удалено в 3.13. distutils уже удалили. Еще можно посмотреть стрим на час про новинки. #release

Помните трик с заменой строки в консоли с помощью символа "\r"? Рассказывал в этом посте. Что будет если сделать несоклько таких символов? Мы вернёмся на несколько строк выше? Нет, так не сработает. Как же сделать замену нескольких строк? Для этого нужна хитрая комбинация символов: \x1b[1A\x1b[2K Что это вообще за магия? Это специальный код для управления курсором консоли. \x1b : экранирующий символ означающий что дальше следует специальный символ. Он же символ ESC [1A : команда "поднять курсор вверх". Есть и другие команды для перемещения курсора в разные стороны. [2K : удалить текущую строку. "2" означает всю строку. Еще есть опции: "0" - от курсора до конца, "1" - от курсора к началу. Итого, наша абракадабра значит - подняться на строку вверх и удалть всю строку. Полный список специальных символов можно найти на этой странице. Эти функции консоли широко используются. Например модуль colorama использует модификации для изменения цвета текста в консоли. В демке на видео показана манипуляция тремя строками в консоли. Пишем три строки, удаляем три строки, и тд. ➡️ Код с демонстрацией #triks

Сделал простой скрипт для управления температурой кулера Raspberry Pi. - Зачем? Их же полно готовых! Даже дефолтные инструмен
Сделал простой скрипт для управления температурой кулера Raspberry Pi. - Зачем? Их же полно готовых! Даже дефолтные инструменты есть. Хотелось сделать этот велосипед по-своему 😁 ▫️Пороговых температур две: Одна контролирует момент включения, другая выключения. Например, выше 80 - включаем. Остыл до 50 - выключаем. ▫️ Значения пороговых температур заипсывается в специальном файле и считывается каждый раз при проверке темературы без рестарта сервиса. Исходники и схема. https://github.com/paulwinex/rpi_fan_control ЗЫ. В схеме присуствует сопротивление. Это требуется только если нужно уменьшить скорость вращения кулера. Мой на полных оборотах сильно гудит, пришлось поставить. #sources #rpi

Как не передавать аргумент в функцию если она его не ждёт? Как-то раз я делал модуль с функциями, которые вызывались как фоновые задачи. В основном они принимали чёткий список позиционных аргументов. И вот, в разгар разработки, пришла новая фича - в каждую такую функцию теперь передаётся Lock-объект. Он позволяет сделать выполнение этой функции синхронным на разных воркерах (как и положено любому локеру). Но вот проблема, в новых функциях, где нужен локер, я его, конечно же, принимаю как аргумент. Но в старых функциях он не предусмотрен. Часто функции вообще без аргументов. Какие варианты решения? ▫️ Добавить во всех функциях в аргументы **kwargs. Это решит все проблемы. Строго говоря, это надо было сделать сразу. Теперь таски не будут падать из-за неизвестного аргумента. И теперь следует не забывать добавлять **kwargs в новых функциях. Но что, если нет возможности изменять код? Тогда... ▫️Проверить, может ли функция принять аргумент с определённым именем. И если не может то не передавать. Это можно сделать с помощью стандартной функции inspect.signature
from inspect import signature

def func(x, y, z=True):
    pass

sig = signature(func)
print(sig)
# <Signature (x, y, z=True)>
print(sig.parameters)
mappingproxy(OrderedDict([('x', <Parameter "x">), ('y', <Parameter "y">), ('z', <Parameter "z=True">)]))

Теперь можно проверить, ожидает ли функция параметр с определённым именем
print('lock' in sig.parameters)
# False

Финальный псевдокод
from tasks import my_task, LockClass
from inspect import signature

task_kwargs = {}
lock = LockClass()
if 'lock' in signature(my_task).parameters:
    task_kwargs['lock'] = lock
my_task(**task_kwargs)

Конечно же, наличие этого имени не гарантирует что функция ожидает именно этот тип. Но это уже нюансы реализации 😼 #tricks

С Новым Годом! 🎁🎉😱
С Новым Годом! 🎁🎉😱

Всех 3D художников поздравляю c проф праздником 3Dекабря❕ 💥🫖⭐️🎨🎁🪄🎉🎥 #offtop
Всех 3D художников поздравляю c проф праздником 3Dекабря❕ 💥🫖⭐️🎨🎁🪄🎉🎥 #offtop

Релиз Python 3.11 В прямом эфире ▶️ https://www.youtube.com/watch?v=PGZPSWZSkJI ▶️ Подробности по релизу https://docs.python.org/3.11/whatsnew/3.11.html

Я нашел самый быстрый способ поднять свой независимый и бесплатный VPN Сразу оговорка, платить придётся только за хостинг. 1️⃣ Покупаем сервер где-то на просторах интернета. Конечно же сервер должен находиться за пределами страны. Например я закупился на https://eurohoster.org/ (не реклама). Проверяйте лимиты по трафику, в идеале - без ограничений. 2️⃣ Ставим docker
sudo apt install docker.io

Если удобней с DockerCompose то ставим и его
sudo apt install docker-compose

3️⃣ Ставим WG-EASY Самый простой способ поднять сервис WireGuard c WebUI это проект wg-easy Код и документация здесь https://github.com/weejewel/wg-easy Запускаем контейнер: https://github.com/weejewel/wg-easy#2-run-wireguard-easy Для тех кто с DockerCompose, забираем файл здесь: https://gist.github.com/paulwinex/be87f79687b96786098ec8fa6a8e251c В обоих случаях потребуется поменять две переменные: WG_HOST - внешний статичный IP вашего сервера PASSWORD - придумайте пароль для WEB UI Остальные параметры указаны ниже на странице github https://github.com/weejewel/wg-easy#options 4️⃣ Ставим клиента Все доступные клиенты здесь https://www.wireguard.com/install/ Есть возможность добавить клиента в Network Manager для управления подключением через UI. Установка зависит от вашей системы, ищите мануалы в сети, их много. https://github.com/max-moser/network-manager-wireguard Скрипт установки для RasperryPi https://gist.github.com/paulwinex/c2c4090f19dbe8bd1253c5744f3f06e1 ЗЫ. Конечно же это не "самый простой" и далеко не единственный способ. А просто тот, который использую я сам. #offtop #linux

Приветствую подписчиков. Я даже несколько удивлён как это вы еще не разбежались 😻)) Многие мне пишут в личку с вопросом "Где брать курсы если сайт закрылся?". Отвечаю — сайт не закрылся❗️ Ввиду некоторой обстановки 💣⚔️🚓 💥 мой хостинг (Украинский кстати) немножко закончился". Мой хороший знакомый, админ данного хостинга, включил мой сервер на пару часов и я скачал все данные. После чего создал новый сервер в Европе и поднял там сайт. На данный момент я закончил настройку и теперь сайт снова доступен. А так же добавил домен COM, для тех у кого RU блокируют. Теперь сайт доступен по адресам: https://cgninjas.ru/ https://cgninjas.com/ (возможно на com почта не будет работать) Также просят выложить всё на Youtube или на Torrent. Да я не против, только исходники у меня пропали вместе с HDD, так что надо потратить немало времени чтобы скачать, систематизировать и залить. Если вдруг выкрою недельку на это, то обязательно сделаю))) ▫️Погодите, а что с каналом? он тоже всё? Нет, ввиду всё тех же событий 💥 потух творческий запал, и мотивация пропала... Но идеи есть, заготовки тем тоже. Возможно, я жду хороших новостей. Обязательно продолжу серию заметок... надеюсь скоро. А до тех пор я не хочу вас раздражать глупой рекламой глупых каналов (которые запрудили телеграм и предложения которой приходят регулярно) а лучше просто помолчу. "Благодарим за понимание ©" ЗЫ. Не пишите пжлст в личку, есть чат для этого ➡️ CGNinjasChat #offtop

Репозитори на почитать для расширения кругозора. ▫️ Большой ликбез по экосистеме Python https://github.com/brunocampos01/unde
+2
Репозитори на почитать для расширения кругозора. ▫️ Большой ликбез по экосистеме Python https://github.com/brunocampos01/understanding-the-python-ecosystem ▫️Подборка самых популярных полезностей для веб разработчиков https://github.com/ml-tooling/best-of-web-python ▫️Подборка библиотек для тех кто уважает типизацию в Python https://github.com/typeddjango/awesome-python-typing #basic #libs

Блокировки, они повсюду... Ох как надоела эта тенденция. Наша IT индустрия буквально стреляет себе в ногу силами определённых личностей и их мнений о том как для нас будет лучше. Как бы там ни было, сейчас все советуют экстренно качать и переносить свои видосы с YouTube на отечественные аналоги. Да, можно использовать оконные софты со всеми удобствами (VLC или Youtube Video Downloader), но мы лучше покодим😉 Я набросал небольшой скрипт для скачивания плейлиста с YouTobe в один клик. Из зависимостей только модуль pytube. ▫️ Для скачивания выбирается максимально доступный размер видео файла. ▫️ Если файл уже существует то скачивания не будет. Удобно для апдейта обновлений. ▫️ Скрипт качает всё из плейлиста с помощью класса pytube.Playlist. Если хотите скачать канал, то просто замените класс на pytube.Channel
from pytube import Channel
PLAYLIST_URL = 'https://www.youtube.com/channel/XXXXXXXXX'
playlist = Channel(PLAYLIST_URL)

Забираем здесь ➡️ #source

Celery это крутой инструмент для очереди задач web-вашего приложения на Python. Но его монополию всё больше притесняет другая библиотека - dramatiq. По словам автора, эта библиотека лишена всех проблем Celery If you’ve ever had to use Celery in anger, Dramatiq could be the tool for you. Обычно далее я пишу примеры как можно быстро опробовать библиотеку. Но кода там прилично, поэтому я сделал репозиторий с примером приложения на Flask. Что реализовано в этом приложении: ▫️Засетаплен dramatiq совместо с Flask с помощью flask-dramatiq ▫️Отправка простых фоновых задач ▫️Отправка периодических cron-задач по расписанию с помощью periodiq ▫️Отмена запущенных задач с помощью dramatiq_abort ▫️Задача с отложенной проверкой результата ▫️Всё закатано в Docker, поэтому заводится с полпинка В качестве брокера используется Redis. Он стартует быстрей чем RabbitMQ и dramatiq_abort пока что поддерживает только его. Шаблонов нет, фронт максимально глуп и минималистичен. 🌎 Код смотрим здесь https://github.com/paulwinex/flamatiq Также стоит посмотреть: dramatiq_dashboard django_dramatiq #libs

Andrii Vynohradov Data Science, Project Management About me: My work experience in business is over 20 years. Not all the way is connected with Data Science (I have been interested in for a long time, but I have been dealing with this direction relatively recently). However, I know perfectly well how the business works from the inside because completed many projects for the implementation and maintenance of ERP class systems. I also had my own, albeit a small business in this area (from 2006 to 2014 in Ukraine). I am interested in further work in the field of Data Science and Machine Learning, I understood that I like it and therefore completed an appropriate courses in Yandex.Praktikum (technical skills) and SkillFactory (Product Management). I tested all libraries for data analysis and machine learning on projects in various areas. My projects are hosted on GitHub. I hope my combined experience in business, desire to develop in the area of Machine Learning and your interesting tasks will help us together in achieving our common goals in various projects. What kind of job I would prefer - Data Scientist Location - Remote, relocation to EU Programming Language - Python (most of ML&DS libraries) - VBA - 1C - SQL Soft - 1C - Asana - MS Office (Word/Excel/PowePoint) - Jupyter Notebook Где работал - SCALAR - Program Manager/Data Scientist - FirstBit, Project Manager & Analyst (greatest project of 1C - Nestle Iran and Syria factories automation) - ProfIT Expert, Program/Project Manager (full automation of automotive plant GEELY in Minsk) - Assino Implementation, Project Manager (ERP implementation in pharmaceutical company BIOCAD) Контакты - Телеграм: @anvvinogradov - Почта: avynohradov@outlook.com - Полное резюме https://1drv.ms/b/s!Atbzj1yrooE8oIcwB6KEyNruJhvQGw?e=o51zeG #резюме

#вакансия Компания АйТи БАСТИОН Приглашает на работу программистов на Python уровня мидл и выше. Открыты вакансии: - Python-программист Написание приложения на Flask для парсинга и работы с данными - Тестировщик Тестирование и автоматизация тестирования на Python Локация: Офис в Москве или удалённо Контакты: - https://it-bastion.com/kontakty/ - Сергей @nw_wind - Митя @keedley

#резюме Дмитрий Самофалов Специализация Python разработчик О себе: - Интересуюсь электроникой и компьютерной графикой Кем хочу работать: - Backend Разработчик - VFX Pipeline Разработчик Локация: - Удалённо, проживаю в г.Воронеж Знаю языки программирования: - Python - C - JavaScript Хорошо владею софтом: - Maya Знание английского: - A2 (Pre-Intermadiate) - ведение деловой переписки, свободное чтение технической литературы и документации. Стек разработки : - Django, Flask, Celery, Redis, PostgreSQL, Linux, Docker Где работал: - Студия "CGF" (ООО "СИ ДЖИ ФЭКТОРИ") - 1 год 3 месяца (по настоящее время) - Фриланс (разработка чат-ботов Telegram, парсеров сайтов) - 6 месяцев - Работа не программистом (указана в резюме) - 9 лет Контакты: - Телеграм: @SD_Resolut - Почта: samdimus@gmail.com - Полное резюме ссылка на Я.Диск - https://disk.yandex.ru/i/OB2VPzhN9R1D3g