Как стать автором
Обновить

Комментарии 12

В целом статья хорошая, но вот этот сниппет явно из каких-то "Вредных советов":

match packet:
    case [c1, c2, *data, footer] if (  # Деконструируем пакет на заголовок, данные и конец
        (checksum := c1 + c2) == sum(data) and  # Проверяем корректность контрольной суммы
        len(data) == footer  # Проверяем корректность размера данных
    ):
        ...

Если в контексте произойдет ошибка, то второй print() не будет вызван.

import contextlib

@contextlib.contextmanager
def retry():
    print("Entering Context")
    yield
    print("Exiting Context")

Правильно:

import contextlib

@contextlib.contextmanager
def retry():
    print("Entering Context")
    try:
        yield
    finally:
        print("Exiting Context")

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

через метаклассы отлично решается задача, когда нужен singletone паттерн:

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

class MetaSingleton(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]


class DatabaseSessionManager(metaclass=MetaSingleton):
    def init(self, db_settings: dict) -> None:
        self.database_url = db_settings["database_url"]
        .....

Можно гораздо проще. Так как модули в Python сами по себе являются синглтонами, то достаточно создать инстанс класса и импортировать уже его. За примерами далеко ходить не надо - модуль logging построен примерно по такому принципу, хотя там конечно все устроено немного сложнее, просто это первое, что пришло в голову.

Не за то, а за трудящихся!

Смешанное чувство от таких материалов. С одной стороны вроде бы хорошо, что язык не стоит на месте, развивается, обретает новые мощные возможности (ну или это я развиваюсь и узнаю наконец о них). Но с другой стороны, хорошо ли такое бесконечное расширение? Оно приведет лишь к тому, что типичная книга "Введение в Python" будет занимать тысячи страниц. Что всех этих фич вместе не будет знать ни один человек. Для большинства они могут выскакивать неожиданно, вызывая удивление и внося сумятицу в код. Со временем они станут ненужным тормозом обратной совместимости. И очень скоро порог вхождения в язык для prod-уровня станет настолько высоким, что знание его станет уделом редких гуру, а новое поколение выкинет его с облегчением, как какой-нибудь КОБОЛ или LDAP, придумает себе очередной простенький JavaScript, и опять начнет увлеченно и беспорядочно навешивать на него заманчивые фичи...

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

Да, читал статью, а в голове "Это простой и понятный читаемый язык для начинающих?!" Имхо, все это совсем не соответствует дзену питона.

В первом же примере кода переменная upper_words - то для списка, то для строки. А ещё пишете о типизации. Нехорошо)

А мне понравилась статья! Понравилась, что написана просто, без напыщенности и апломба. Питон знаю на начальном уровне(как хобби) и было интересно узнать о всяких возможностях.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий