Я про второй случай. Вы берёте Protocol, но используете его как ABC. Structural subtyping не про это. В PEP 544 есть примеры с явным наследованием и вот что там об этом написано:
To explicitly declare that a certain class implements a given protocol, it can be used as a regular base class. In this case a class could use default implementations of protocol members. Static analysis tools are expected to automatically detect that a class implements a given protocol. So while it's possible to subclass a protocol explicitly, it's not necessary to do so for the sake of type-checking.
Делать raise NotImplementedError() в теле метода протокола, судя по PEP 544, тоже не нужно, достаточно либо написать докстринг, либо ограничиться ellipsis или pass.
Я лишь хотел донести что вы взяли Protocol, который про structural subtyping и используете его как абстрактный класс, а для этого в стандартной библиотеке Python уже есть модуль abc, который и следовало бы использовать.
А для чего в примерах вы везде наследуетесь от протколов, хоть там никакой реализации нет? Ведь главная идея протоколов — нет необходимости в явном наследовании.
Это не ключевое слово, а название класса в builtin пространстве имён
Python 3.9.5 (default, May 24 2021, 12:50:35)
[GCC 11.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keyword
>>> keyword.iskeyword('object')
False
>>> import builtins
>>> builtins.object
<class 'object'>
Вот любите вы в skillfactory все задачи через парсинг решать.
Но ведь у хабра есть RSS-лента, как для своего кастомного фида, так и для любого хаба. В вашем случае фид будет иметь ссылку https://habr.com/ru/rss/company/skillfactory/blog/?fl=ru
И получать посты с RSS гораздо проще и правильнее, чем парсить html.
А на GraalVM не смотрели?
https://habr.com/ru/post/534044/
А я думал что собеседования и нужны для отсеивания (читай "отпугивания") большей части соискателей, чтобы оставить только тех кто нужен компании
>Выше, указывали, что
_
не хранит в себе данныхВы бы хоть проверили прежде чем такое писать
>>> [_ for _ in range(3)]
[0, 1, 2]
Не будем
>>> List1 = [3, 4, 5]
>>> [0 for _ in List1]
[0, 0, 0]
>>> list(range(len(List1)))
[0, 1, 2]
И что там пишут? Что
[0 for i in List1]
и[0 for _ in List1]
разные выражения?Хранит, это такая же переменная как и любая другая
Вы ведь знаете образом динамические языки предоставляют собственно "динамичность"?
>Кажется, вы немного не так поняли, нужно создать список с нулями такой же длины,
Я не про эту задачу, а в качестве предупреждения на будущее, раз статью писал "молодой разраб на python"
>Как минимум, потому что бесполезная итерация по List1 может дорого стоить
А тут
list(repeat(0, len(List1)))
по вашему мнению нет бесполезной итерации?В cpython нет JIT
Опытный разработчик как раз воспользовался бы
[0 for _ in List1]
Только вот пятое решение можно применять только если в список кладётся иммутабельный объект, иначе может произойти такое:
>>> data = {'hop'}
>>> l = [data] * 3
>>> l
[{'hop'}, {'hop'}, {'hop'}]
>>> data.add('hey')
>>> l
[{'hey', 'hop'}, {'hey', 'hop'}, {'hey', 'hop'}]
Первое решение которое пришло в голову, это list comprehension:
Руководитель сказал, да, это python way, но можно оптимизировать по памяти:
А в чем собственно оптимизация по памяти заключается? Это два абсолютно одинаковых выражения
Делать
raise NotImplementedError()
в теле метода протокола, судя по PEP 544, тоже не нужно, достаточно либо написать докстринг, либо ограничиться ellipsis или pass.Я лишь хотел донести что вы взяли Protocol, который про structural subtyping и используете его как абстрактный класс, а для этого в стандартной библиотеке Python уже есть модуль abc, который и следовало бы использовать.
Возьмите эту книгу www.amazon.com/Architecture-Patterns-Python-Domain-Driven-Microservices/dp/1492052205 она о том же, но более подробно, с большим количеством примеров.
Это не ключевое слово, а название класса в builtin пространстве имён
</зануда mode>
"Леди и джентльмены, моё вам здрасьте"