Python академия
7.72K subscribers
2.33K photos
6 videos
269 links
Python академия. Учи Python быстро и легко. По всем вопросам @evgenycarter
Download Telegram
Определение имени функции изнутри этой функции в Python

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

Рассмотрим простой пример. Допустим, есть модуль mymodule и в нем функция myfunc. И нужно, чтобы при вызове mymodule.myfunc() эта функция могла выводить свое имя.


# mymodule.py

def myfunc():
print("my name is", __myname__) # как определить __myname__?


Как видно из примера, требуется найти способ определить имя функции myfunc внутри самой этой функции.

В Python нет встроенного способа определить имя функции изнутри этой функции, но это можно сделать с помощью метода name объекта функции.

# mymodule.py

def myfunc():
print("my name is", myfunc.__name__)


В этом случае при вызове функции myfunc она выведет «my name is myfunc».

Такой способ работает, потому что в Python функции являются объектами, и у всех объектов функции есть атрибут name, который содержит имя функции.

Обратите внимание, что такой способ работает только тогда, когда функция вызывается по имени, которое было использовано при ее определении. Если же функцию присвоить другой переменной и вызвать по этому новому имени, то myfunc.__name__ все равно вернет первоначальное имя функции:

# mymodule.py

def myfunc():
print("my name is", myfunc.__name__)

anothername = myfunc
anothername() # выведет "my name is myfunc"


Таким образом, с помощью метода name можно определить имя функции изнутри этой функции в Python.


Подписывайтесь на канал 👉@pythonofff
👍4
Делаем планировщик задач

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

Основной его плюс в том, что он максимально интуитивный и имеет гибкий функционал. А еще schedule не требует внешних зависимостей и сам в целом легковесный.

Здесь на самом деле даже объяснять особо нечего, логика методов в этом пакете понятна на примерах.

Подписывайтесь на канал 👉@pythonofff
👍72
Потребление памяти при сортировке в Python

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

Подписывайтесь на канал 👉@pythonofff
Получаем текст с картинки

У Google есть система Tesseract, которая позволяет парсить текст с картинок с помощью оптического распознавания символов.

И в качестве обертки над их системой, был создан пакет pytesseract, который максимально удобно и легко использовать.

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

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

Подписывайтесь на канал 👉@pythonofff
👍41
Для чего используется *args в Python?

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

Подписывайтесь на канал 👉@pythonofff
👍32
Удобная работа с файловыми путями

В стандартной библиотеке есть максимально удобный пакет pathlib, позволяющий осуществлять различную работу с файловыми путями.

Для представления пути к файлу есть класс Path, с объектами которого уже можно производить операции. Например, методы exists() и is_dir() проверяют, существует ли файл и является ли он директорией.

Но самой классной фичей является замена os.path.join() на более удобный и элегантный вариант с использованием слэшей, как показано на картинке.

Таким образом, пакет pathlib может стать частичной заменой os в некоторых случаях при работе с файловыми путями.

Подписывайтесь на канал 👉@pythonofff
👍5🥰21🔥1
Регистрация функции с помощью декораторов в Python

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

Подписывайтесь на канал 👉@pythonofff
1
Отправляем электронные письма

SMTP (Simple Mail Transfer Protocol) — это протокол, позволяющий отправлять электронные письма. В стандартной библиотеке есть пакет smtplib, реализующий его поведение.

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

Отправлять письма можно одноименным методом sendmail, который принимает адреса отправителя и получается, а также сам текст. В конце программы следует закрывать соединение с помощью метода quit().

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

Подписывайтесь на канал 👉@pythonofff
👍31
Обзор простых декораторов в Python

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

Подписывайтесь на канал 👉@pythonofff
1👍1
Бесконечность

Вообще float является крайне интересным типом данных и не перестает удивлять своими особенностями. Про значение Not a Number мы уже писали, а вот сегодня поговорим про infinity.

Строковые литералы 'inf' и 'infinity' можно конвертировать в float, и в результате получается значение бесконечности. Для отрицательной "бесконечности" нужно поставить знак минуса перед словом.

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

Подписывайтесь на канал 👉@pythonofff
👍3
Создание декоратора с аргументами

Здесь видно, что декоратор my_decorator не принимает никаких аргументов, во время декорирования функции, но имплементация этого декоратора принимает аргумент f, через который Python передает ссылку на декорированную функцию.

Подписывайтесь на канал 👉@pythonofff
Получаем данные о системе

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

Если говорить про практические применение, psutil полезен в основном для мониторинга системы, ограничения ресурсов процессов и управления запущенными процессами.

Помимо привычных Windows, MacOS и Linux, библиотека также поддерживает системы FreeBSD, OpenBSD, NetBSD, Sun Solaris и AIX.

Подписывайтесь на канал 👉@pythonofff
👍4
Нужны ли декораторам аргументы?

Есть множество проблем, которые можно решить с помощью декораторов, и некоторые из них были рассмотрены в предыдущих уроках данного курса. Однако в некоторых ситуациях могут пригодиться и аргументы. Рассмотрим в качестве примера знаменитый декоратор app.route из веб-фреймворка Flask

Подписывайтесь на канал 👉@pythonofff
👍1
Как отслеживать url в формах на django?

Чтобы отслеживать URL в формах Django, вы можете использовать метод get_absolute_url() в моделе и функцию reverse() для построения URL.

В моделе добавьте метод get_absolute_url() для создания URL объекта. Например:
from django.urls import reverse

class YourModel(models.Model):
# поля модели

def get_absolute_url(self):
return reverse('your-view-name', args=[str(self.id)])


Создайте HTML-шаблон для формы, в которой вы можете использовать action для указания URL, куда будет отправляться данные формы. Например:
<form action="{{ object.get_absolute_url }}" method="post">
<!-- поля формы -->
<button type="submit">Submit</button>
</form>


В файле urls.py определите путь к вашему представлению. Укажите имя представления, чтобы использовать его в методе get_absolute_url() вашей модели.
from django.urls import path
from . import views

urlpatterns = [
path('your-url/<int:pk>/', views.YourView.as_view(), name='your-view-name'),
]

В представлении (views.py) реализуйте обработку формы. Например:
from django.views.generic.edit import CreateView
from .models import YourModel

class YourView(CreateView):
model = YourModel
fields = '__all__'


Теперь, когда вы отправляете форму, она будет отправляться на конкретный URL, который вы определили в методе get_absolute_url() вашей модели.


Подписывайтесь на канал 👉@pythonofff
👍2
Разница между == и is

Многие разработчики не понимают разницу этих двух операторов сравнения. Из-за неправильного использования == и is в приложениях могут возникнуть странные ошибки.

Оператор == проверяет равенство значений двух объектов. А оператор is проверяет идентичность самих объектов. Его используют, чтобы удостовериться, что переменные указывают на один и тот же объект в памяти.

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

Подписывайтесь на канал 👉@pythonofff
👍71
Скачиваем вебсайты целиком

Максимально простой, но при этом мощный пакет pywebcopy поможет вам клонировать отдельные веб-страницы или даже целые сайты.

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

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

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

Подписывайтесь на канал 👉@pythonofff
👍21
inspect добро пожаловать за кулисы

Модуль inspect пригодится вам для использования того, что происходит за кулисами в Python. Вы так же можете вызывать его методы в них же!

Снизу пригодится метод inspect.getsource() для вывода его собственного исходного кода. Еще используется метод inspect.getmodule() для вывода модуля, в котором его утвердили.

Подписывайтесь на канал 👉@pythonofff
pprint - Стандартная функция Python

Print() делает своё дело. Но если попытаться вывести большой вложенный объект, результат будет выглядеть не так уж и приятно.

Тут на помощь приходит модуль из стандартной библиотеки pprint (pretty print). С его помощью можно выводить объекты со сложной структурой в читабельном виде.

Подписывайтесь на канал 👉@pythonofff
👍2🔥21
Логические all и any

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

Функция any возвращает значение True, если хотя бы одно из переданных утверждений верно, all – в случае, если все верны.

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

Подписывайтесь на канал 👉@pythonofff
👍4🔥21😁1
Аннотации типов

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

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

Подписывайтесь на канал 👉@pythonofff