Найти тему
Simple Prog

5 удобных инструментов при написании кода на Python

Оглавление

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

Источник: https://unsplash.com/photos/cYyqhdbJ9TI
Источник: https://unsplash.com/photos/cYyqhdbJ9TI

Параметры *args и *kwargs

Рассмотрим пример:

Думаю, все хоть раз видели такую запись со звездочками. Сразу скажу, что args и kwargs — общепринятые имена переменных, так что вместо них можно написать что угодно, но рекомендуется именно так.

В примере выше функция принимает обязательный аргумент value, а все остальные аргументы идут по усмотрению. В таком случае *args упаковывает все не именованные аргументы в кортеж (как произошло с 'txt', 12345, [1, 2, 3]), а **kwargs — все именованные в словарь (color и name).

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

Вычисление размера объектов

Для вычисления размера объекта мы можем использовать функцию getsizeof(object[, default]) из встроенного модуля sys. Так как в Python все является объектами, то и размер мы можем определить практически у любого такого элемента.

Функция getsizeof вызывает у объекта метод __sizeof__ и добавляет дополнительные служебные данные для сборщика мусора. Аргумент default определяет значение, которое вернется, если у объекта не будет метода __sizeof__ и вызовет исключение TypeError.

Создаем контекстный менеджер с помощью декоратора

В большинстве случаев протокол управления контекстом реализуют с помощью класса и двух методов: __enter__ и __exit__. Но такой подход может быть сложным в некоторых реализациях.

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

При входе в блок with выполняется та часть функции tag, которая идет до yield. Затем исполняется сам этот блок, а уже потом выполняется оставшаяся часть, которая идет после yield.

Хэширование

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

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

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

Источник: https://unsplash.com/photos/BI465ksrlWs
Источник: https://unsplash.com/photos/BI465ksrlWs

Атрибуты функций

Возможно, для кого-то это будет шоком, но функции — это такие же объекты, у которых просто реализован метод __call__. Именно он позволяет использовать синтаксис с вызовом с помощью круглых скобок.

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

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

Понравилась статья? Не забудь подписаться и оставить свое мнение в комментариях, обязательно прочту и отвечу.

Читайте также:

Наука
7 млн интересуются