Что изучать дальше?
Предположим, теперь ты знаешь кунг-фу, Нео мы изучили Python. Что дальше?
Синтаксис — семантика — прагматика — практика. Нельзя объять необъятного.
- Сам язык и use cases
Приёмы разработки (планируется в следующем семестре, но это не ро Python)
Методики и подходы типа классического и неклассических ООП (под П имеется в виду «Проектирование>), «проектирование на уровне типов», ECS и т. п.
MyPy и инструменты разработки для него (массово используется в индустриальном программировании)
- Asyncio и инструментарии под него
- Прикладные инструментарии и дисциплину программирования в них
- Датасатанизм и его инструментарии
- …
Главное: решать как можно больше своих практических задач.
Что мы не посмотрели в Python
(это очень жаль ☹) Не было разговора про стиль оформления кода, хотя бы про pep-8 и best practices.
Языковые модули, такие как dataclasses, enum, weakref и т. п. Это как бы расширения языка, а мы его проигнорировали
Инструменты разработки, встроенные в сам дистрибутив Python. Об этом — курс следующего семестра (+ сторонние инструменты, конечно)
Полезные для боевого программирования модули, типа pathlib, subprocess, http и т. п. — их довольно много
- …
Работа со сторонними пакетами (pip, venv и т .д.) — в курсе следующего семестра
http://PyPi.org: 709 289 проектов (Сколько там было осенью?)
Модули и пакеты
Как работает import
В частности, importer и finder (sys.meta_path)
Есть реализация на Python, можно почитать
$PYTHONPATH и sys.path
Модуль — это
Пакеты
Структура пакета:
пакет/
__init__.py
(возможно) ещё что-то .py
- …
(возможно) подпакет/
__init__.py
(возможно) ещё что-то .py
- …
(возможно) подподпакет/
- …
(возможно) подпакет/
- …
Правила:
import пакет — только __init__.py
from пакет import что-то
from пакет import *, если в __init__.py есть __all__ = имена, — имена из __all__
относительный import (статья на Real Python)
для подмодулей пакета (чтобы не проимпортировать случайно не из соседнего модуля, а из sys.pth)
./pkg/two.py:from .sub import four ./pkg/two.py: ./pkg/two.py:SECOND = 2 ./pkg/two.py:print(f"{SECOND=} {four.FOURTH=}") ./pkg/sub/three.py:from ..two import SECOND ./pkg/sub/three.py:from ..sub.four import FOURTH ./pkg/sub/three.py: ./pkg/sub/three.py:THIRD = 3 ./pkg/sub/three.py:print(f"{SECOND=} {THIRD=} {FOURTH=}") ./pkg/sub/four.py:FOURTH = 4 ./pkg/one.py:from . import two ./pkg/one.py:from .sub import three ./pkg/one.py: ./pkg/one.py:FIRST = 1 ./pkg/one.py:print(f"{FIRST=} {two.SECOND=} {three.THIRD=}")→
- …
Дополнительно
Модуль — это программа, if __name__ == "__main__"
Пакет — это программа, если есть пакет/__main__.py
python -m пакет
Кстати, многие стандартные модули Python имеют интерфейс -m, например python3 -m calendar
Cборники (namespace packages)
Нет __init__.py
Зато могут встречаться в нескольких местах sys.path:
. ├── one │ └── pkg │ └── first.py ├── prog.py └── two └── pkg └── second.py
Обзор стандартных модулей
Стандартные модули в докуентации
- Сам обзор — по времени сколько успеем
В 3.13 выкинули аж 19 модулей, в 3.14, кажется, ни одного, но зато сильно проредили API
- Как меняются модули от выпуска к выпуску
- Как часто появляются новые пакеты в стандартном дистрибутиве?
Zstd в 3.14, sqlite backend для dbm в 3.13, tomllib в 3.11, graphlib в 3.9…
The Zen of Python, by Tim Peters
import this
import antigravity
Д/З
Доделать Д/З ☺
