Комментарии 24
В целом статья хорошая, но вот этот сниппет явно из каких-то "Вредных советов":
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, и опять начнет увлеченно и беспорядочно навешивать на него заманчивые фичи...
Ну пока что никто не выкинул кучу основных языков, которые гораздо сложнее раннего Питона.
Да, читал статью, а в голове "Это простой и понятный читаемый язык для начинающих?!" Имхо, все это совсем не соответствует дзену питона.
После выхода тайпскрипта, с его крайне удачной алгебраической системой типов, многим захотелось так же. Поэтому много изменений как раз связано с системой типов.
А по поводу динамичного развития с частым отправлением конструкций в деприкейтед: ну вот была джава, в которой десятками лет особо ничего нового не привносили, или тот же js - в итоге создали кучу оберток и транспайлеров, чем заставили оригинальные языки развиваться.
Таков естественный путь жизни языка, я не вижу смысла этому противиться. PL-1 его уже успешно прошёл, С++ находится на стадии "снова ягодка опять", следом идут Java и С#. Почему Python-у должно быть запрещено обрастать новыми фичами и хорошеть с возрастом ?
Я считаю, пускай Python вберёт в себя некоторые внешние проявления языков семейства ML ! Таким образом язык и комьюнити быстрее доберутся до более сложных задач (граблей?) совмещения мутабельности и наследования с одной стороны и фич иммутабельных по умолчанию функциональных языков. Пусть у Python получится не хуже, чем у Scala и пускай он не потеряет популярность по дороге, успупив место новому молодому простому языку.
В первом же примере кода переменная upper_words - то для списка, то для строки. А ещё пишете о типизации. Нехорошо)
А мне понравилась статья! Понравилась, что написана просто, без напыщенности и апломба. Питон знаю на начальном уровне(как хобби) и было интересно узнать о всяких возможностях.
Тем, кто пишет про возрастающую сложность современных версий языка. Входной порог по прежнему низкий. Все описанное в статье - advanced штуки, нисколько не претендующие на обязательность. Вы всегда можете быстро написать простой скрипт на питоне, без типизации, без байто*бства, без темной магии метаклассов. Но все это семантическое богатство позволяет выражать сложное поведение, на тот случай если питон вам нужен для чего то большего, чем скриптинг.
А для чего именно? напишите если не лень пж. Мне просто интересно как новичку.
Точно так же можно сказать про c++ - никто не заставляет использовать все его богатство, пишите как на C. Только это "богатство" рано или поздно больно стреляет в ногу.
Ну на пайтон наверное чутка придется постараться попасть в ногу все таки. Типизация, указатели, управление памятью...или нет?🤔
Ну, это не из новинок, но например mutable-типы могут больно стукнуть.
Еще недавно у меня тупой баг был из-за truthy/falsy - решил вообще больше этим не пользоваться, все логические условия прописывать явно.
а котеджами заменить нельзя? или не тот случай?

" По поводу truthy/falsy
— да, бывает опасно полагаться на неявную логику. Например, []
, 0
, ""
и None
все считаются False
, но иногда это поведение может привести к путанице. Явные проверки вроде if value is not None and value != 0:
могут быть безопаснее.(С) gpt
не я их еще не встречал, но прочту на досуге документацию
В тему статьи: однажды я провёл нетривиальное время пытаясь понять, почему
print(False == False in [False])
выводит true.
14 интересных фич Python (возможно, не совсем pythonic)