- PVSM.RU - https://www.pvsm.ru -

Итак, вы уже продвинутый новичок — вы изучили основы Python и способны решать реальные задачи.
Вы уже отходите от просмотра туториалов и чтения блогов; наверно, уже ощущаете, что в них излагаются одномерные решения простых придуманных задач; вероятно, вместо решения этой конкретной задачи вы хотите совершенствоваться в решении задач в целом.
Наверно, вы слышали, что нужно нарабатывать понимание чтением и написанием больших объёмов кода. Это правда.
Но какой же код нужно читать?
«Просто читай то, что нравится». А если вы не знаете, что вам нравится? А если вам не нравится что-то правильное?
Или хуже того — если вам нравится что-то неправильное и из-за этого у вас выработаются вредные привычки?
В конечном итоге, для этого ведь необходимо понимание… Но именно его мы и стремимся обрести.
«На GitHub куча проектов — выберите понравившийся и изучайте, как его реализовали разработчики». Однако самые успешные проекты довольно объёмны — с чего начинать?
И даже если вы знаете, с чего начинать, не всегда очевидно, как разработчики пришли к своему решению.
Да, вы видите код своими глазами, но он не говорит вам о том, почему разработчики написали его так, чего они не делали и как они рассуждали о проекте в целом.
Другими словами, из самого кода неочевидно, какой была философия его проектирования, и какие варианты решений разработчики рассматривали, прежде чем остановиться на конкретной реализации.
В этой статье мы рассмотрим некоторые модули стандартной библиотеки Python.
В целом, стандартная библиотека Python неидеальна для изучения «хорошего» стиля.
Хотя все её модули полезны, они не особо однородны:
С другой стороны, как минимум часть из них имеет подробные предложения (proposals), объясняющие задачи и компромиссные решения, а новые модули достаточно однородны.
Мы рассмотрим как раз некоторые из них.
Если игнорировать стиль, у стандартной библиотеки можно многому научиться, ведь она решает реальные задачи множества разных разработчиков.
Любопытно изучить различия в возможностях stdlib и её новых внешних альтернатив — разница между ними демонстрирует дефицит, который испытывают разработчики (ведь в противном случае они бы не заморачивались созданием альтернативы). Хорошим примером этого является разница между urllib и requests.
Приблизительно в таком порядке:
Модуль statistics [1] добавляет в стандартную библиотеку статистические функции; он не создавался в качестве конкурента таких библиотек, как NumPy, а «находится на уровне построителя графиков и научного калькулятора».
Он был внедрён в PEP 450 [2]. Если вы незнакомы с этим предложением, то это очень любопытное чтиво:
NumPy и самодельными решениями; он особенно хорошо демонстрирует, что и почему было добавлено в стандартную библиотеку.Кроме того, документация очень удобна. Это сделано нарочно; цитата из предложения:
«Большая часть документации предназначена для читателей, понимающих базовые концепции, но которые могут не знать (например), какую дисперсию им стоит использовать [...] Однако документация избегает скучных математических подробностей».
Код относительно прост, а когда это не так, то в нём есть комментарии и ссылки на подробные объяснения или статьи. Это может быть полезным, если вы изучаете все эти концепции и вам проще читать код, чем математическиe условные обозначения.
Модуль pathlib [3] обеспечивает простую иерархию классов для работы с путями файловой системы; он является высокоуровневой альтернативой os.path [4].
Модуль был внедрён в PEP 428 [5]. Большинство примеров используется для иллюстрации лежащей в основе модуля философии, а код оставлен в качестве спецификации.
Код хорошо читается по следующим причинам:
pathlib, то могли работать с os.path, или с похожей библиотекой в каком-то другом языке.pathlib и os.path решают одну задачу, однако в совершенно разных стилях программирования. Кроме того, существовало ещё одно предложение [6], которое было отклонено, а ещё есть не меньше пяти похожих библиотек; pathlib позаимствовал что-то от каждой из них.
Модуль dataclasses [7] снижает объём бойлерплейта при написании классов, генерируя специальные методы наподобие __init__ и __repr__. (См. в качестве введения этот туториал [8], потому что в нём используются гораздо более конкретные примеры, чем в официальной документации.)
Он был внедрён в PEP 557 [9] в качестве упрощённой версии attrs [10]. Раздел Specification схож с документацией; интересные вещи встречаются в Rationale, Discussion и Rejected Ideas.
Код превосходно откомментирован; особенно любопытно это использование [11] таблиц решений [12]
(ASCII-версия [13], версия со вложенными if [14]).
Кроме того, это отличный пример метапрограммирования; этот аспект подробно рассматривается в докладке Реймонда Хеттингера Dataclasses: The code generator to end all code generators [15]. [Слайды с доклада в HTML [16] и PDF [17].] Если у вас возникли проблемы с пониманием кода, то сначала посмотрите доклад; для меня оказалось довольно полезным объяснение генерируемого кода.
Модуль graphlib [18] был добавлен в Python 3.9, и на данный момент содержит только одну вещь: реализацию алгоритма топологической сортировки (вот описание [19] того, что это такое, и почему он полезен).
Он появился не через PEP; однако у него есть issue [20] со множеством комментариев от разных разработчиков ядра, в том числе Реймонда Хеттингера и Тима Питерса (известного своим «Дзен языка Python»).
Так как это, по сути, решённая задача, в обсуждениях рассматривается API: куда его вставлять, кто должен его вызывать, как представлять входные и выходные данные, как одновременно обеспечить простоту использования и гибкость.
В обсуждении пытаются примирить два различных способа использования модуля:
В отличие от PEP, здесь можно увидеть, как решение эволюционирует в процессе чтения. В большинстве предложений описываются и другие варианты. но если вы не следите за рассылкой, то легко может сложиться впечатление, что они просто появляются, полностью сформировавшиеся.
По сравнению с обсуждением issue, сам код очень мал — меньше 250 строк, и в основном состоит из комментариев и документации.
Серверы для разработчиков и не только! Дешёвые VDS [21] на базе новейшего «железа» для размещения проектов любой сложности, от корпоративных сетей и игровых проектов до лендингов и VPN.
Подписывайтесь на наш чат в Telegram [22].
Автор: Mikhail
Источник [23]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/365751
Ссылки в тексте:
[1] statistics: https://docs.python.org/3/library/statistics.html
[2] PEP 450: https://www.python.org/dev/peps/pep-0450/
[3] pathlib: https://docs.python.org/3/library/pathlib.html
[4] os.path: https://docs.python.org/3/library/os.path.html
[5] PEP 428: https://www.python.org/dev/peps/pep-0428/
[6] ещё одно предложение: https://www.python.org/dev/peps/pep-0355/
[7] dataclasses: https://docs.python.org/3/library/dataclasses.html
[8] этот туториал: https://realpython.com/python-data-classes/
[9] PEP 557: https://www.python.org/dev/peps/pep-0557/
[10] attrs: https://www.attrs.org/en/stable/why.html#data-classes
[11] это использование: https://github.com/python/cpython/blob/3.9/Lib/dataclasses.py#L779
[12] таблиц решений: https://www.hillelwayne.com/decision-tables/
[13] ASCII-версия: https://github.com/python/cpython/blob/3.9/Lib/dataclasses.py#L119
[14] версия со вложенными if: https://bugs.python.org/issue32929#msg312829
[15] Dataclasses: The code generator to end all code generators: https://www.youtube.com/watch?v=T-TwcmT6Rcw
[16] HTML: https://www.dropbox.com/s/te4q0xf46zkuu21/hettinger_dataclasses_pycon_2018.zip
[17] PDF: https://www.dropbox.com/s/m8pwkkz43qz5pgt/HettingerPycon2018.pdf
[18] graphlib: https://docs.python.org/3/library/graphlib.html
[19] описание: https://runestone.academy/runestone/books/published/pythonds3/Graphs/TopologicalSorting.html
[20] issue: https://bugs.python.org/issue17005
[21] Дешёвые VDS: https://vdsina.ru/
[22] наш чат в Telegram: https://t.me/vdsina
[23] Источник: https://habr.com/ru/post/566134/?utm_source=habrahabr&utm_medium=rss&utm_campaign=566134
Нажмите здесь для печати.