Получи случайную криптовалюту за регистрацию!

Python Заметки

Логотип телеграм канала @pythonotes — Python Заметки P
Логотип телеграм канала @pythonotes — Python Заметки
Адрес канала: @pythonotes
Категории: Технологии
Язык: Русский
Количество подписчиков: 2.71K
Описание канала:

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

Рейтинги и Отзывы

3.00

3 отзыва

Оценить канал pythonotes и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

0

4 звезд

2

3 звезд

0

2 звезд

0

1 звезд

1


Последние сообщения 9

2021-04-02 12:02:02
https://devdocs.io/python~3.9/

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

#basic
710 views09:02
Открыть/Комментировать
2021-03-31 12:01:34 Порой админу проще написать огромный bash-скрипт с запросами в БД и парсингом через регулярки чем пытаться тоже самое изобразить в Python. Тоже самое верно и в обратном случае. Даже простые shell команды порой удобней записать в Python скрипт чем на bash. Правда, в обоих случаях выглядит это всё не очень.
Если сталкивались с таким, то поймёте о чем я
Специально для вас сделал подборку библиотеки для работы с shell из Python. Чтобы ваш код оставался красивым и читабельным!

sh
Переносим bash синтаксис в Python. Удобно и немногословно.
Ранее я уже рассказывал про этот модуль, можно глянуть в этом посте.

plumbum
Аналогичен sh но со своими плюшками. Например встроенная колоризация вывода

pexpect
Библиотека для интерактивного взаимодействия с процессом через stdin/stdout.
Нашел небольшой гайд на русском.

shell_command
Еще одна библиотека для вызова shell-команд. Ориентируется на безопасность вызываемого кода и заточена на удобство для админов.

Бонусом
envoy
Обёртка вокруг subprocess делающая его использование еще проще и минималистичней.
_______________
Кстати, до Python 2.6 вместо subprocess была библиотека commands. Выглядит достаточно аскетично)

#libs
811 views09:01
Открыть/Комментировать
2021-03-24 12:01:35 Если вы сейчас в ищите где применить ваши Python-скилы да еще и денег за это получать, подпишитесь на новый канал с вакансиями job_python.

Это не автопостинг, все вакансии отбираются вручную.
Полное описание, высокие зарплаты и теги для фильтрации.
Минимум 3 вакансии в день!

https://t.me/job_python
678 views09:01
Открыть/Комментировать
2021-03-22 12:01:37 Иногда хочется чтобы в качестве объекта передачи данных был удобный класс но не хочется (или нет возможности) писать сераиализатор в JSON для него. Идеально было бы сделать класс, который сам умел бы сериализоваться в JSON дефолтным модулем без указания дополнительных сериализаторов.
Как это сделать?

Стандартный модуль JSON умеет правильно сериализовать стандартные типы. Но нам нужен кастомный класс с удобными методами и свойствами. Ответ очевиден - наследуемся от стандартного типа!

В качестве базового типа возьмем словарь. Например, мне нужен класс некоего абстрактного элемента списка с именем и индексом. Тогда реализация может быть такой.

class Item(dict):
def __init__(self, name, index=0):
super().__init__(name=name, index=index)

@property
def name(self):
return self['name']

@name.setter
def name(self, value):
self['name'] = value

@property
def index(self):
return self['index']

@index.setter
def index(self, value):
self['index'] = value

def __setitem__(self, key, value):
if key not in ['index', 'name']:
raise KeyError
super().__setitem__(key, value)

Я добавил два свойства с простым переназначением данных в словарь. Но предполагается, что там будут проверки значений и иные вычисления. Еще хорошо бы добавить методы __str__ и __repr__.

>>> it = Item('item name')
>>> it.name
'item name'
>>> it.index
0

Также можно добавить любые методы классу. Например я переопределил __setitem__ чтобы нельзя было задать иные ключи.

>>> it['key'] = 123
KeyError

Хотя, можно сделать как-то иначе. К примеру, все отличные от основных ключи записывать в отдельный ключ.

def __setitem__(self, key, value):
if key not in ['index', 'name']:
self['meta'][key] = value
else:
super(Item, self).setitem(key, value)

Ну а главная особенность этого класса в том, что он легко понимается стандартным модулем json (конечно, если значения ключей это тоже стандартные типы или наследованные от них)

>>> json.dumps(item)
'{"index": 2, "name": "item name"}'

Самый очевидный пример, использование в библиотеке requests. Передавая объект в аргумент json, мы не можем повлиять на его сериализацию, то есть добавить класс-сериализатор. Там ожидается готовый словарь или иной совместимый тип.

import requests
requests.post(url, json=item)

А вот так выглядит альтернатива с методом toJson()

requests.post(url, data=item.toJson(),
headers={'Content-Type': 'application/json'})

А ещё ничто не мешает нам в любой момент конвертнуть наш класс в обычный словарь

>>> dict(item)
{"index": 2, "name": "item name"}

Не спорю, возможно есть более "умные" решения этой задачи Но, тем не менее, аналогичным образом работает стандартный collections.namedtuple. Он тоже наследуется от стандартного tuple, расширяет его функционал и сериализуется без дополнительных средств.

Для более сложных случаев можно посмотреть на библиотеку dataclasses-json, которая поможет сериализовать dataclasses.

#tricks #libs
919 views09:01
Открыть/Комментировать
2021-03-19 12:00:00 Стандартная Django админка работает стабильно но не могу сказать что она меня устраивает. Да, есть базовый набор стандартного функционала, но чего-то всегда не хватает. Может автокомплитов а может тёмной темы.

Долгое время я использовал DjangoSuit, но проект заглох на невыпущенной альфе 2й версии которая в Django3 и вовсе не поддерживается.

Что же можно сегодня посоветовать?
На сегодняшний день у меня два фаворита:

DjangoJET
сайт
репозиторий
видео

Крутая и красивая админка с кучей плюшек.
автокомплиты с AJAX подгрузкой
темы
дашборды
респонсив
кастомизация панелей прямо в админке

Стоит денег для коммерческих продуктов. Для опенсорса бесплатно (AGPL)!

Django Jazzmin
репозиторий

Не такая пафосная но от этого не менее крутая админка.
полностью кастомизируется
много готовых тем и возможность собрать свою прямо в админке
Bootsrtap Model окна вместо всплывающих окон
интегрирован Select2
респонсив

Знаете еще крутые админки? Напишите в комментах!

#django #libs
725 views09:00
Открыть/Комментировать
2021-03-15 12:01:19 Кроме стандартных системных ивентов аудита можно вызывать свои ивенты. Для этого используется функция sys.audit()

import sys

def my_hook(event, args):
if event == 'mymodule.myevent':
print('Catched!', args)

sys.addaudithook(my_hook)

sys.audit('mymodule.myevent', 1, 2, 3)

Просто указываем имя ивента первым аргументом и далее любые аргументы.

Такое будет полезно если вы разрабатываете серьезную библиотеку в которой вопрос безопасности стоит не на последнем месте. Дать возможность другим разработчикам добавлять свои проверки будет хорошей практикой!
Хотя никто не запрещает придумать свой способ использования перехвата подобных событий.

Особенно это будет знакомо тем, кто пишет приложения на PyQt. Очень уж похоже на систему сигнал/слот в режиме DirectConnection.

следует вызывать sys.audit() ПОСЛЕ проверки данных но ДО фактического применения и исполнения логики. Это поможет избежать лишней проверки данных вне основной логики и прервать операцию в нужный момент.
в имени ивента рекомендуется использовать неймспейс с именем вашего модуля.

#tricks
1.2K views09:01
Открыть/Комментировать
2021-03-12 12:01:20 Для Python3.8 в PEP0578 добавили функционал аудита Runtime операций. Это позволяет выполнять хуки (функции) при возникновении определённых событий в интерпретаторе.

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

Полный список стандартных аудит-ивентов можно посмотреть здесь. Из названий становится ясно что мы можем перехватить. Например, мы можем перехватить факт открытия файла (open), импорта модуля (import), копирование файла (shutil.copyfile), запуск процесса (subprocess.Popen) и тд. Как минимум мы можем залогировать данное событие, как максимум, вызвать аварийное завершение программы.

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

Представим, что после разработки и долгих тестирований веб сервиса вы могли где-то оставить функцию ручного ввода данных в консоль. На продакшене такое недопустимо. С помощью аудита можно вызвать исключение перехватив ивент builtins.input

С помощью ивента socket.getaddrinfo можно определить на какие сайты юзер заходил с помощью вашего приложения.

Ивент exec позволит проверить загруженный объект кода перед его исполнением. Например выявить потенциально опасный код, или оставленные API ключи в строковых переменных.

Как добавить свой хук?

Для первого теста выполните такой код в самом начале работы приложения

import sys

def hook(event, args):
print(f'EVENT: {event}{args}')

sys.addaudithook(hook)

Каждый хук вызывается для всех событий, поэтому мы можем с помощью одного хука увидеть всё что происходит в интерпретаторе.
Теперь давайте посмотрим какие web-коннекты создаются при работе нашего кода. Для запросов используем requests.

import sys
import requests

def socket_hook(event, args):
if event == 'socket.getaddrinfo':
print(args[0])

sys.addaudithook(socket_hook)
requests.get('https://google.com')

В аутпуте вы увидите домен, на который был сделан запрос.

А так же:
есть платформозависимые хуки (например взаимодействие с winapi)
можно писать хуки на Си
так как это мера для обеспечения безопасности, нет способа удалить хуки после добавления.

Напоминаю, доступно в Python3.8+

#pep #tricks
695 views09:01
Открыть/Комментировать
2021-03-10 12:01:23 8 Марта вышел альфа-релиз Python 3.10.0a6
Уже сейчас можно его скачать и попробовать новый синтаксис Switch Statement, о котором я упоминал ранее.
В Python его назвали Structural pattern matching

Итак, как это теперь выглядит?

match QUERY:
case VALUE1:
return 1
case VALUE2:
return 2
case VALUE3:
return 3
case _: # default
return 0

Для объединения нескольких значений в одном кейсе используем вертикальную черту

match QUERY:
case VALUE1 | VALUE2:
return 3
case _: # default
return 0

Также можно добавлять дополнительные проверки с if

match QUERY:
case VALUE1:
return 1
case VALUE2 | VALUE3 if x < 5:
return 2
case _: # default
return 0

Выглядит как синтаксический сахар для конструкции if..elif..else. В целом не плохо, но и непривычно)

#tricks
226 views09:01
Открыть/Комментировать
2021-03-08 18:01:23


#offtop
951 views15:01
Открыть/Комментировать
2021-03-05 12:01:07 В Python есть удобный почтовый debug-сервер. Он поможет проверить работу почты вашего web-проекта на этапе разработки без необходимости настраивать внешние сервисы или взаимодействие с реальными серверами Google или Yandex. Этот сервер просто печатает все сообщения в консоль.
Таким образом удобно дебажить одноразовые ссылки активации или просто факт отправки письма по расписанию.

Запускается очень просто:

python3 -m smtpd -n -c DebuggingServer localhost:1025

Теперь настройте ваш проект на использование этого сервера. Например вот так настраивается Django:

# settings.py
if DEBUG:
EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_USE_TLS = False
DEFAULT_FROM_EMAIL = 'noreply@mysite.com'

#django #tricks
1.7K views09:01
Открыть/Комментировать