Skip to content

Commit 6ab4af1

Browse files
committed
Init project
0 parents  commit 6ab4af1

14 files changed

+734
-0
lines changed

README.md

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<img src="./ru-docs/assets/main.png"/>
2+
3+
# Содержание
4+
## Модуль 1: Основы типизации в Python
5+
* **[1.1 Введение в типизацию: зачем, когда и как?](./ru-docs/Введение_в_типизацию.md)**
6+
* Динамическая и статическая типизация: плюсы и минусы
7+
* Типизация в Python: история и эволюция
8+
* Инструменты для статической типизации: mypy, PyCharm, другие
9+
* **[1.2 Базовые типы данных:](./ru-docs/Базовые_типы_данных.md)**
10+
* int, float, str, bool: основы работы с типами
11+
* None: отсутствие значения и его особенности
12+
* Duck typing: неявная типизация в Python
13+
* **[1.3 Коллекции и их типизация:](./ru-docs/Коллекции_и_их_типизация.md)**
14+
* list, tuple, dict, set: работа с коллекциями
15+
* Типизация коллекций: List\[int\], Tuple\[str, int\], Dict\[str, float\]
16+
* Генераторы и итераторы: типизация и особенности
17+
* **[1.4 Функции и типизация:](./ru-docs/Функции_и_типизация.md)**
18+
* Аннотация типов для аргументов и возвращаемого значения
19+
* Перегрузка функций и типы
20+
* Callable: работа с функциональными объектами
21+
* **[1.5 Классы и типизация:](./ru-docs/Классы_и_типизация.md)**
22+
* Аннотация типов для атрибутов класса
23+
* Методы класса и типизация
24+
* Наследование и типизация: как типы взаимодействуют с наследованием
25+
26+
## Модуль 2: Продвинутая типизация
27+
* **[2.1 Типизация с ипользованием TypeVar:](./ru-docs/Типизация_с_использованием_TypeVar.md)**
28+
* Создание универсальных функций и классов
29+
* Ограничение типов с помощью TypeVar
30+
* Практические примеры использования TypeVar
31+
* **[2.2 Типы объединений (Union) и опциональные типы (Optional):](./ru-docs/Типы_объединений_и_опциональные_типы.md)**
32+
* Работа с переменными, которые могут иметь разные типы
33+
* Использование Optional для обозначения возможности отсутствия значения
34+
* **[2.3 Типы псевдонимов:](./ru-docs/Типы_псевдонимов.md)**
35+
* Создание собственных имён для сложных типов
36+
* Повышение читаемости и удобства работы с кодом
37+
* **[2.4 Типы Any, NoReturn:](./ru-docs/Типы_Any_и_NoReturn.md)**
38+
* Any: отключение проверки типов для конкретной переменной
39+
* NoReturn: указание на то, что функция не возвращает значение
40+
* **[2.5 Типы протоколов:](./ru-docs/Типы_протоколов.md)**
41+
* Определение интерфейсов для классов без явного наследования
42+
* Structural typing: проверка типов по структуре, а не по имени
43+
## Модуль 3: Типизация в реальных проектах
44+
* **[3.1 Интеграция mypy в рабочий процесс:](./ru-docs/Интеграция_mypy.md)**
45+
* Настройка mypy для проверки типов в проекте
46+
* Интерпретация ошибок mypy и их исправление
47+
* **[3.2 Stub файлы:](./ru-docs/Stub_файлы.md)**
48+
* Что это такое и зачем нужны?
49+
* Как типизировать сторонние модули
50+
* Генерация stub файлов

ru-docs/Stub_файлы.md

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# Типизация и сторонние библиотеки
2+
Работа с типами в Python становится особенно важной, когда вы используете сторонние библиотеки. В этом разделе мы рассмотрим, как эффективно интегрировать типизацию в проекты, использующие внешние зависимости, а также как создавать стаб-файлы для библиотек, которые не предоставляют аннотации типов.
3+
4+
## Что такое стаб-файлы?
5+
Стаб-файлы (или stub files) — это специальные файлы с расширением `.pyi`, которые используются в **Python** для предоставления информации о типах данных в коде, особенно когда речь идет о внешних библиотеках, которые не содержат аннотаций типов. Они позволяют разработчикам использовать преимущества статической типизации, не изменяя исходный код библиотек.
6+
7+
## Зачем нужны?
8+
В Python, как и в других языках программирования, типизация помогает избежать ошибок, связанных с неправильным использованием данных. Например, если функция ожидает получить число, а вы передаете строку, это может привести к ошибкам во время выполнения программы. Стаб-файлы помогают:
9+
- **Указать ожидаемые типы аргументов и возвращаемых значений**: Это позволяет статическим анализаторам кода и IDE (например, PyCharm или VSCode) проверять ваш код на наличие ошибок до его выполнения.
10+
- **Упростить работу с нетипизированными библиотеками**: Если вы используете стороннюю библиотеку, которая не поддерживает аннотации типов, вы можете создать стаб-файл для этой библиотеки и указать в нем необходимые типы.
11+
12+
## Как работают?
13+
Стаб-файлы содержат описание функций и классов, которые предоставляет библиотека, но без их реализации. Вместо этого они используют многоточие (`...`), чтобы указать, что реализация находится в другом месте. Например:
14+
15+
```python
16+
# my_library.pyi
17+
def my_function(param: int) -> str: ...
18+
```
19+
20+
В этом примере мы указываем, что функция `my_function` принимает один аргумент типа `int` и возвращает значение типа `str`.
21+
22+
## Как создать стаб-файл?
23+
1. **Определите функции и классы**: Изучите исходный код модуля, чтобы понять, какие функции и классы он предоставляет.
24+
2. **Создайте файл с расширением `.pyi`**: Например, если ваш модуль называется `my_library`, создайте файл `my_library.pyi`.
25+
3. **Опишите типы**: Внутри файла укажите типы для всех функций и классов.
26+
27+
Пример стаб-файла для простой библиотеки:
28+
```python
29+
# my_library.pyi
30+
def add(a: int, b: int) -> int: ...
31+
32+
def greet(name: str) -> str: ...
33+
```
34+
35+
Если у вас есть сложная структура, организуйте стаб-файлы в подкаталоги с использованием `__init__.pyi` для пакетов.
36+
37+
## Где разместить стаб-файлы?
38+
Стаб-файлы могут быть размещены в разных местах:
39+
- **В той же директории, что и библиотека**: Это самый простой способ.
40+
- **В отдельной папке**: Вы можете создать папку для всех ваших стаб-файлов и добавить её в переменную окружения `MYPYPATH`, чтобы Python мог их найти.
41+
42+
Пример добавления пути к стаб-файлам:
43+
```bash
44+
export MYPYPATH=~/path/to/stubs
45+
```
46+
47+
## Генерация стаб-файлов
48+
- **Использование `stubgen`**: Вы можете использовать инструмент `stubgen`, который входит в пакет `mypy`, чтобы автоматически генерировать стаб-файлы для сторонних библиотек:
49+
```bash
50+
pip install -U mypy stubgen -m library_name
51+
```
52+
- Сгенерированные файлы будут сохранены в директории `out/`. Однако имейте в виду, что автоматически сгенерированные файлы могут не содержать полной информации о типах и документации.
53+
- **Использование сторонних проектов**: Существуют проекты, которые предоставляют готовые стаб-файлы для популярных библиотек. Вы можете скачать их и разместить в директории с установленным модулем.

ru-docs/assets/main.png

211 KB
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
## int, float, str, bool: основы работы с типами
2+
***
3+
Python предлагает следующие базовые типы данных:
4+
* `int`: Целые числа (например: 10, -5, 0).
5+
* `float`: Числа с плавающей точкой (например: 3.14, -2.5, 0.0).
6+
* `str`: Строки (например: "hello", "world", "123").
7+
* `bool`: Логический тип, принимающий значения `True` или `False`.
8+
9+
Примеры аннотации типов для базовых типов:
10+
```python
11+
age: int = 30
12+
price: float = 19.99
13+
name: str = "Alice"
14+
is_active: bool = True
15+
```
16+
17+
## None: отсутствие значения и его особенности
18+
***
19+
`None` — специальный тип, который обозначает отсутствие значения.
20+
```python
21+
result: None = None
22+
```
23+
24+
Важно понимать, что `None` — не то же самое, что 0, пустая строка или `False`. Это отдельный тип, который указывает на отсутствие какого-либо значения.
25+
26+
## Duck typing: неявная типизация в Python
27+
***
28+
Python также использует концепцию duck typing. Это неявная типизация, основанная на том, что "если что-то ходит как утка и крякает как утка, то это, вероятно, утка".
29+
30+
Другими словами, Python не всегда строго проверяет типы объектов, а смотрит на то, какие методы и атрибуты у них есть. Если объект поддерживает необходимые методы и атрибуты, то он считается подходящим, независимо от его конкретного типа.
31+
32+
```python
33+
def print_length(obj):
34+
print(len(obj))
35+
36+
print_length("hello") # Вывод: 5
37+
print_length([1, 2, 3]) # Вывод: 3
38+
```
39+
40+
В этом примере функция `print_length` принимает любой объект, у которого есть метод `len`. Она не проверяет конкретный тип объекта, что является примером duck typing.
41+
42+
**Duck typing** делает Python гибким, но может усложнить отладку кода, так как ошибки типов могут проявиться только во время выполнения. Использование аннотаций типов и статических анализаторов помогает снизить риски, связанные с duck typing, и повысить надежность кода.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
## Введение в типизацию: зачем, когда и как?
2+
***
3+
В этом разделе мы рассмотрим, почему типизация важна в Python, когда ее стоит применять и как она реализована в языке.
4+
## Динамическая и статическая типизация: плюсы и минусы
5+
***
6+
Python — язык с динамической типизацией. Это значит, что тип переменной определяется во время выполнения программы, а не во время написания кода. Такой подход обладает рядом **преимуществ**:
7+
* Гибкость: Вы можете легко менять типы переменных на лету, не беспокоясь о строгих ограничениях компилятора.
8+
* Быстрое прототипирование: Динамическая типизация позволяет быстро создавать прототипы, фокусируясь на логике программы, а не на формальностях типов.
9+
* Меньше кода: Вам не нужно объявлять типы переменных, что делает код более лаконичным.
10+
11+
Однако у динамической типизации есть и **недостатки**:
12+
* Ошибки типов во время выполнения: Ошибки, связанные с неверным использованием типов, могут проявиться только во время работы программы, что усложняет отладку.
13+
* Снижение читаемости кода: Без явного указания типов сложнее понять, какие данные хранятся в переменных и как они используются.
14+
* Проблемы с масштабированием: В больших проектах с множеством разработчиков отсутствие строгой типизации может привести к путанице и ошибкам, которые сложно отследить.
15+
16+
Статическая типизация решает эти проблемы. Она требует, чтобы типы переменных были объявлены заранее, во время написания кода. Это позволяет:
17+
* Обнаруживать ошибки типов на этапе компиляции: Компилятор или статический анализатор кода проверяет типы, предотвращая ошибки во время выполнения программы.
18+
* Повысить читаемость кода: Явное указание типов делает код более понятным и легким для восприятия.
19+
* Упростить рефакторинг: Статическая типизация помогает легче и безопаснее изменять код, так как компилятор или анализатор кода может обнаружить несоответствия типов.
20+
## Типизация в Python: история и эволюция
21+
***
22+
Python изначально был языком с динамической типизацией. Однако с ростом популярности языка и увеличением размеров проектов разработчики начали испытывать необходимость в статической типизации.
23+
24+
В **Python 3.5** были введены аннотации типов: возможность добавлять информацию о типах к переменным, аргументам функций и возвращаемым значениям.
25+
26+
>[!warning] Важно!
27+
>Они никак не влияют на работу программы, но могут использоваться статическими анализаторами кода, например **mypy**.
28+
29+
В Python 3.6 появился новый синтаксис для переменных с объявленными типами. Это позволяет объявлять тип переменной, используя двоеточие и имя типа: `age: int = 25`.
30+
## Инструменты для статической типизации: mypy, PyCharm, другие
31+
***
32+
Для работы со статической типизацией в Python существует ряд инструментов:
33+
* **mypy**: Самый популярный статический анализатор кода для Python. Он проверяет типы в коде и сообщает об ошибках.
34+
* **PyCharm**: Популярная IDE для Python, которая включает встроенную поддержку статической типизации и интеграцию с mypy.
35+
* Другие инструменты: Существуют и другие инструменты для статической типизации, например Pyre, Pytype, которые предлагают свои особенности и возможности.
36+
37+
В этом курсе мы будем использовать mypy в качестве основного инструмента для статической типизации, так как он является наиболее распространенным и хорошо поддерживаемым инструментом.

0 commit comments

Comments
 (0)