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

Python Software Developer

Отправить сообщение

pip install beautifulsoup4

Берём html-код страницы Хабра.

Вот любите вы в skillfactory все задачи через парсинг решать.

Но ведь у хабра есть RSS-лента, как для своего кастомного фида, так и для любого хаба. В вашем случае фид будет иметь ссылку https://habr.com/ru/rss/company/skillfactory/blog/?fl=ru

И получать посты с RSS гораздо проще и правильнее, чем парсить html.

А я думал что собеседования и нужны для отсеивания (читай "отпугивания") большей части соискателей, чтобы оставить только тех кто нужен компании

>Выше, указывали, что _ не хранит в себе данных

Вы бы хоть проверили прежде чем такое писать

>>> [_ 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))) по вашему мнению нет бесполезной итерации?

Опытный разработчик как раз воспользовался бы [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:

#t1.py
List1 = [3, 4, 5]
result = [0 for i in List1]

Руководитель сказал, да, это python way, но можно оптимизировать по памяти:

#t2.py
List1 = [3, 4, 5]
result = [0 for _ in List1]

А в чем собственно оптимизация по памяти заключается? Это два абсолютно одинаковых выражения

Я про второй случай. Вы берёте 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, который и следовало бы использовать.
А для чего в примерах вы везде наследуетесь от протколов, хоть там никакой реализации нет? Ведь главная идея протоколов — нет необходимости в явном наследовании.
Подобных, подробных и практических, статей не встречал. Хотя искал много.

Возьмите эту книгу www.amazon.com/Architecture-Patterns-Python-Domain-Driven-Microservices/dp/1492052205 она о том же, но более подробно, с большим количеством примеров.
<зануда mode>
object — это ключевое слово питона.

Это не ключевое слово, а название класса в 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'>

</зануда mode>

"Леди и джентльмены, моё вам здрасьте"

Ну так а откуда тогда рептилоиды взялись, если не из динозавров эволюционировали?

Информация

В рейтинге
Не участвует
Откуда
Киевская обл., Украина
Зарегистрирован
Активность