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

Подпишись на группу Вконтакте и Телеграм-канал. Там еще больше полезного контента для программистов.
А на YouTube-канале ты найдешь обучающие видео по программированию. Подписывайся!

Этот материал является неким продолжением, однако здесь скорее будут рассмотрены вещи, которые никак не повлияют на работу, а скорее просто удивят в процессе познавания «Дзена Python».

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

Аннотирование переменных

В Python есть возможность аннотировать переменную: при объявлении или при указании параметра функции. Например:

def print_int(number:int) -> None:
print(number)

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

number:int = 1

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

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

variable:1 = 1
second_variable:variable = 1

Удивительно, но в Python 3.x работают оба варианта. Немного странно, не так ли?

Теперь перейдём к абсолютно бесполезному, но довольно забавному факту при работе со словарями.

Строковое представление словарей

Экземпляр класса dict, как и любой объект в Python, можно «распечатать» с помощью функции print.

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

class C(object):
    def __init__(self, value):
        self.v = value

    def __repr__(self):
        return str(self.v)

Экземпляры такого класса хэшируемы, потому могут стать ключами словаря.

number = C(1)

d = {1:1, number:1}

print(d)
----------------------------
{1: 1, 1: 1}

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

На этом сайте уже вышли две статьи про магические методы: первая и вторая часть.

И напоследов, мы реализуем постинкремент в Python. Да да.

Постинкремент в Python.

В таких языках, как С, С++, и т. д., существует инкремент. Это конструкция вида i++, которая увеличивает значение переменной i на 1. Для такой цели в питоне мы используем оператор +=, то есть пишем i += 1.

Забавный факт: в Python мы с помощью пользовательских классов сможем имитировать поведение постинкремента.

Помимо бинарного оператора + в питоне существует и «унарный плюс» — инструкция +n эквивалентна n.__pos__(). Учитывая, этот факт, нам остается только лишь определить два маленьких пользовательских класса.

class Number:
    def __init__(self, value):
        self.value = value


    def __pos__(self):
        self.value += 1


class MyNumber:
    def __init__(self, value):
        self.__value = Number(value)


    def __pos__(self):
        return self.__value


    def __str__(self):
        return str(self.__value.value)

Инициализируем экземпляр класса MyNumber следующим образом:

number = MyNumber(1)

Конструкция ++number эквивалентна +n, где nMyNumber.__value, что является экземпляром класса Number.

++number
++number

print(number)
--------------------
3

Всё работает, как часы. Довольно интересная механика, которую можно применить также и к постдекременту.

Заключение

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

Советую прочитать предыдущую статью про странности питона — «Поговорим о странностях питона«.

А также подписывайтесь на группу ВКонтакте, Telegram и YouTube-канал. Там еще больше полезного и интересного для программистов.