Senior Python Developer
43.7K subscribers
2.09K photos
4 videos
1 file
526 links
№ 4931117861
Публикуем интересные/полезные фичи/библиотеки языка.

По вопросам сотрудничества: @adv_and_pr

Канал на бирже:
https://telega.in/c/seniorpy
Download Telegram
Получаем текст с картинки

У Google есть система Tesseract, которая позволяет парсить текст с картинок с помощью оптического распознавания символов. В качестве обертки над их системой был создан пакет pytesseract, который удобно и легко использовать.

Чтобы получить текст с картинки, надо вызвать метод image_to_string. Если вас интересует текст на русском, то следует указать аргумент lang как 'rus'.

Для открытия картинок рекомендуется использовать pillow, хоть и имеется возможность просто указать путь к файлу в виде строки.
Временные файлы

В стандартной библиотеке Python имеется модуль tempfile, содержащий классы и методы для работы со временными файлами и директориями. Такие файлы нужны для сохранения промежуточных результатов выполнения программы.

Функция TemporaryFile создает временный файл в системной директории и возвращает файлоподобный объект.

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

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

В качестве примера на картинке парсим статью https://proglib.io/sh/DhyuCFH5p3. Плюс пакета в том, что весь процесс парсинга автоматизирован и не надо вручную искать нужные теги и тянуть из них данные.

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

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

Вместо запятой можно использовать нижнее подчеркивание. Например, 1_000_000 интерпретируется как целое число 1000000.
Объект Ellipsis

В Python есть крайне интересный объект, который обозначается как ..., то есть многоточие. Он называется Ellipsis, и используется в основном как заготовка для чего-то ещё не реализованного.

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

Если привести его к логическому типу данных, то увидим True — это важный момент, потому что похожий на Ellipsis по своей сути None выдает False.
Ищем ошибки с помощью assert

Инструкция assert принимает логическое выражение и необязательное сообщение. Используется для проверки типов, значений аргумента и вывода функции, а ещё для отладки, поскольку останавливает программу в случае ошибки.

Если выполнить инструкцию assert с логическим выражением, результат которого равен True, то ничего не произойдет. Но в случае с False будет сгенерировано исключение AssertionError.

Однако не нужно пытаться обработать исключение AssertionError блоком try-except, так как assert тогда теряет свой смысл.

В примере на картинке проверяется, является ли переданный аргумент числовым типом данных. Если не является, то будет вызвано исключение и выведено указанное сообщение.
Имеется кортеж вида T = (4, 2, 3). Какая из операций приведёт к тому, что имя T будет ссылаться на кортеж (1, 2, 3)?
Anonymous Quiz
23%
T[0] = 1
20%
T = (1) + T[1:]
34%
T = (1,) + T[1:]
23%
T.startswith(1)
Python-dateutil

Пакет предлагает мощные расширения стандартного модуля datetime. С этой библиотекой можно сделать много полезного, но мы ограничимся одним примером, который используется чаще всего, — нечеткий разбор (парсинг) дат. Документацию пакета можете найти по ссылке.
Pillow

Pillow является ответвлением Python Imaging Library. Эта библиотека подойдет для создания миниатюр, преобразования в различные форматы, наложения фильтров, вращения и отображения изображений и т.д. К тому же это идеальный вариант для пакетной обработки большого количества изображений.

Для большей наглядности приведу пример того, как вы можете отобразить изображение из Python-кода. Проект устанавливается, как всегда, с помощью pip, документацию можете найти по ссылке.
Операторы множеств

Множество — это коллекция, где все элементы уникальны, то есть одно и то же значение не может повторяться дважды.

Кроме обычных методов у множеств реализована поддержка различных операторов: пересечение, объединение, симметрическая разность, обычная разность и другие.

Примеры этих операторов можете посмотреть на картинке.
Работаем с буфером обмена

Есть пакет pyperclip, который позволяет отправлять текст в буфер обмена вашего компьютера и получать его оттуда.

В этом пакете есть две основные функции — copy() и paste(), по названиям которых сразу понятны их предназначения — копировать и вставлять.

Получается, что можно прямо через код копировать вывод программы в буфер обмена вместо того, чтобы делать это вручную.
Как работают статические методы

Статические методы создаются в классе при помощи декоратора @staticmethod. Такие методы привязываются к классу, а не объекту — в этом и основное отличие.

Данный тип методов не может модифицировать ни объект, ни сам класс, то есть передавать объект или класс и прописывать self или cls в аргументах не надо.

Функцию стоит вносить в класс в качестве статического метода в том случае, когда эта функция логически относится к классу и имеет смысл там быть.
Оператор неравенства и Бэрри

1 апреля 2009 года выпустили PEP 401, в котором говорилось, что Гвидо ван Россум покидает команду Python.

На его замену должен был прийти Barry Warsaw, который имел официальный статус Friendly Language Uncle For Life (FLUFL) — в переводе "дружелюбный дядя языка на всю жизнь".

И этот Дядя Бэрри предложил заменить "противный" знак неравенства != на <>. Изменения обещали выпустить в последующих версиях, но его можно было протестировать и раньше времени.

Для этого можно импортировать barry_as_FLUFL из пакета __future__. Результат можете видно на картинке.

Это всё было первоапрельской шуткой, но оператор <> всё ещё доступен и является некой пасхалкой.
FuzzyWuzzy

Множество раз вам могло прийти в голову реализовать “размытую” функцию поиска для вашей программы, которая в процентах может сравнивать строки. FuzzyWuzzy предоставляет готовое и лёгкое решение.

В первом примере кода на картинке с помощью fuzz.ratio мы сравниваем две строки и получаем ответ 83, означающий, что они совпадают на 83%.

Если у вас есть список строк, и совпадения необходимо искать во всех строках, FuzzyWuzzy поможет выделить наиболее похожие. Это мы и делаем во втором примере, сравнивая строки data visualisation и custom behavior со строками из arr. При этом в функцию process.extract в качестве параметра также передаётся limit, задающий, сколько значений мы хотим получить.
Хэширование

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

Для хэширования значений есть встроенная (её не надо устанавливать или импортировать) функция hash(). Используется в основном для сравнения разных объектов — сравнивать хэши легче и выгоднее.

Однако изменяемые объекты по типу списков и словарей нельзя хэшировать — интерпретатор выдаст ошибку.

Кстати, есть две пасхалки. Хэш бесконечности равен первым цифрам числа Пи, а хэш Not a Number равен нулю.

А ещё бывают коллизии: например, хэши чисел -1 и -2 одинаковы.
Построчно считываем текстовый файл в список

При парсинге часто бывает, что необходимо построчно выгрузить файл в массив. Алгоритм действий проиллюстрирован на картинке:

1) Загружаем файл (для примера взят file.txt) с помощью open;
2) Считываем построчно в переменную content с помощью метода readlines;
3) Удаляем все символы новой строки с помощью strip.
Аннотация типов

Даёт возможность проставлять в коде подсказки для программистов, не используя комментарии.

При большом количестве кода бывает, что забывается, какой тип должна принять/вернуть функция. Для этого можно воспользоваться такой полезной фичей.
Библиотека Selenium

Функционал библиотеки необходим для работы с браузером. В тестировании она является одной из самых популярных. При выполнении кода с картинки откроется браузер Chrome и перейдет на сайт python.org, а также выберет первый html-элемент с классом button.

Возможности библиотеки:
1. Автоматизация работы браузера.
2. Парсинг сайтов, нажатия на кнопки.
3. Эмуляция различных действий пользователя.
4. Отправка GET/POST запросов.

Документация доступна по ссылке.
Упрощенная работа с JSON

Есть один интересный пакет JMESpath, который позволяет декларативно указать, как извлекать элементы из JSON.

Основные примеры использования показаны на картинке. Метод search принимает паттерн, по которому требуется извлечь данные, а также словарь, который сам похож на JSON.

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

Функция all возвращает True, если переданный ей список пустой или все его элементы истинны.

Функция any возвращает True, если хотя бы один из элементов переданного списка истинный.

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