1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
Часто в проектах на Python мы используем внешние библиотеки — уже готовые скрипты с нужными нам функциями, которые упрощают разработку. Теперь настало время сделать свою первую библиотеку на Python с нуля.
Есть несколько способов собрать свою библиотеку — и все они рабочие. Мы выбрали способ, который рекомендует Гвидо ван Россум — автор языка Python, но вы можете выбрать любой другой подход.
## Подготовка
Чтобы сборка библиотеки прошла без проблем, обновим менеджер пакетов pip. Для этого в командной строке выполним команду:
```markup
pip install --upgrade pip
```
Теперь установим пакет twine — он нам поможет опубликовать свою библиотеку в сети, чтобы её мог установить любой желающий:
```markup
pip install --upgrade twine
```
Затем поставим `hatchling` — пакет для сборки серверной части библиотеки:
```markup
pip install hatchling
```
И наконец, установим пакет `build`, чтобы создать загрузочные архивы с нашей библиотекой:
```markup
pip install --upgrade build
```
## Структура библиотеки
Библиотека в Python — это не просто один скрипт, а целый проект, в котором есть много разных файлов, каждый из которых отвечает за что-то своё.
Первое, что делаем, — создаём папку `src`, в которой будет лежать наша новая библиотека. После этого внутри этой папки создаём ещё одну — с именем создаваемой библиотеки. Как мы назовём эту вложенную папку, так и будет называться наша библиотека. Для проекта мы выбрали название `beginning_package`.
Теперь внутри папки с названием создаём два файла:
- __init__.py — файл, который покажет компьютеру, что beginning_package — это не просто папка, а целый модуль с определённой функциональностью;
- main.py — тут будет код нашей библиотеки.
Теперь делаем остальной обвес и внутри основной папки создаём такое:
- папку tests — если к библиотеке делаются тесты, они отправляются сюда. У нас их пока не будет, но папка, даже пустая, всё равно нужна, таковы правила;
- LICENSE — файл с лицензией. Расширения нет, только имя;
- pyproject.toml — отвечает за конфигурацию и серверную часть библиотеки;
- README.md — информация о библиотеке: что она делает, зачем нужна и какие у неё особенности.
В итоге по структуре должно получиться что-то вроде этого:

Тут ещё есть папка venv для виртуального окружения, но нам она сегодня не понадобится
## Оформляем лицензию и файл README.md
Наша библиотека будет относиться к свободному ПО, поэтому в файл с лицензией мы вставляем стандартный текст MIT License. В первой строке указываем копирайт и название проекта:
Текст лицензии

Точно так же заполняем файл README.md. Обычно здесь показывают, какие функции доступны в пакете, причём здесь уже можно использовать маркдаун для оформления текста. У нас учебная библиотека, поэтому сделаем максимально простое описание:
```markup
This library is not that useful. Perhaps someday it will become great.
```
(Это не очень полезная библиотека. Возможно, когда-нибудь она станет лучше)

## Заполняем pyproject.toml
Рyproject.toml — это файл, который отвечает за служебную часть библиотеки: как она называется, какая версия, какая версия Python нужна, по какой лицензии распространяется и так далее. Когда мы хотим установить новую библиотеку, система сначала смотрит в этот файл и проверяет, соответствует ли ваша версия Python той, что нужна для работы.
Файл состоит из блоков, каждый из которых отвечает за что-то своё. Начнём с блока `build-system` — он отвечает за параметры сборки загрузочного архива. В нашем проекте за серверную часть отвечает `Hatchling`, поэтому указываем его:
```python
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
```
Python
Copy
Дальше идут основные параметры проекта: название, выпуск, авторы, описание, имя файла readme, требования к версии Python, язык программирования, тип лицензии и совместимость с ОС:
```python
[project]
name = ""
version = "0.0.1"
authors = [
{ name="", email="" },
]
description = ""
readme = "README.md"
requires-python = ">=3.10.0"
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
]
```
Python
Copy
В конце можно добавить разные ссылки, например, на репозиторий в GitHub, домашнюю страницу проекта или на дополнительные материалы:
```python
[project.urls]
Homepage = ""
Issues = ""
```
Python
Copy
## Пишем библиотеку
В папке с библиотекой два файла — `__init.py__` и `main.py`. Файл `__init__.py` можно оставить пустым — он нужен для того, чтобы сборщик понял, что это именно цельный проект и его нужно собрать из других файлов в той же папке.
В `main.py` пишем сам код библиотеки. Так как это самая первая и учебная наша библиотека, сделаем там только одну функцию с приветствием:
```python
def greeting():
return "Hello, I'm your first library!"
```
Python
Copy
## Создаём загрузочные архивы
Цель этого этапа — собрать и подготовить библиотеку к загрузке в менеджер пакетов `pip`, откуда каждый сможет её установить. Для этого открываем командную строку, переходим в папку с проектом и собираем архив:
```markup
py -m build
```

Если в проводнике мы посмотрим на структуру папок, то увидим, что там появилась новая папка — `dist`, в которой и хранятся наши подготовленные для загрузки архивы:

Заглянем внутрь:

## Создаём токен для подписи библиотеки
PyPi — это хранилище открытого программного обеспечения для Python. Чтобы опубликовать там библиотеку, нужно иметь аккаунт и получить уникальный API-токен.
Для этого заходим на официальный сайт [pypi.org](https://pypi.org/), заводим новый аккаунт, привязываем Гугл-аутентификатор для безопасности и переходим [в настройки аккаунта](https://pypi.org/manage/account/). Там прокручиваем страницу вниз до блока API tokens:
|