Правильное использование Optional в Python: советы и примеры
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Если нужно указать, что переменная может принимать значения определённого типа T
или быть равной None
, используйте конструкцию Optional[T]
из модуля typing
.
from typing import Optional
def greet(name: Optional[str]) -> str:
return f"Привет, {name if name is not None else 'землянин'}!"
Использование аргумента типа name
показывает, что он может принимать как строковые значения, так и значение None
, что увеличивает надежность кода и облегчает работу с проверкой типов.
Обновление подсказок типов в Python 3.10+
В версии Python 3.10+ благодаря появлению оператора объединения |
стало возможным создавать более простые и элегантные подсказки к типам.
def welcome(name: str | None) -> str:
return f"Добро пожаловать на борт, {name if name is not None else 'незнакомец'}!"
Такой способ записи не только очевиден, но и позволяет заменить выражение Optional[str]
на str | None
. Он максимально компактен и понятен!
Сохранение совместимости с будущими версиями с __future__
В версиях Python 3.7-3.9 вы можете использовать оператор объединения |
, импортированный из модуля __future__
, чтобы обеспечить совместимость с будущими версиями.
from __future__ import annotations
def invite(name: str | None) -> str:
return f"Приглашение отправлено, {name if name is not None else 'незримый гость'}!"
Такой подход позволяет использовать новый синтаксис, сохраняя при этом совместимость с текущей версией Python.
Явное указание типов элементов в коллекциях
Для точной документации типов внутри коллекций рекомендуется использовать typing.Dict
и typing.List
вместо просто dict
и list
.
from typing import Dict, List, Optional
def process_data(values: List[int], options: Optional[Dict[str, str]] = None) -> None:
# Обработка списка и словаря
Явное описание ожидаемых типов устраняет двусмысленность и обеспечивает соответствие типам элементов в коллекциях.
Краткость с PEP 604
В Python 3.10+ появился PEP 604, благодаря которому, опциональные типы теперь можно записывать как Type | None
.
Подчеркивание намерений с помощью Optional
Optional[]
или запись | None
идеально подходят для параметров, которые могут быть не заданы. Это своего рода «договор», который указывает на допустимость None и облегчает работу статического анализатора кода mypy.
def compute(value: Optional[float] = None) -> float:
if value is not None:
return value * 2
raise ValueError("Ожидается какое-либо значение, но передан None!")
Автоматизированное обновление аннотаций с помощью pyupgrade
Обновите аннотации типов с помощью инструмента pyupgrade
. Настройте его в качестве предкоммит-хука. Опцией --keep-runtime-typing
можно сохранить совместимость аннотаций типов с инструментами реального времени.
IDE и mypy автоматически выводят Optional
IDE и инструменты, такие как mypy, умеют автоматически выводить тип Optional
для аргументов, у которых значение по умолчанию — None
. Это помогает предотвратить ошибки, учетом и отображением None
как возможного значения.
Визуализация
Работу с Optional
можно сравнить со страховочной сетью для ваших выступлений на арене подсказок типов:
Без Optional:
Трапеция 🎪 = Страховочный трос*[ожидаемый тип]
Риск падения 😰: Неожиданный 'None' на вашем пути
С Optional
:
Трапеция с Optional 🎪🛡️ = Страховочный трос*[ожидаемый тип] + Сеть безопасности*['None']
Выступление безопасно ✅: 'None' и ожидаемый тип — оба приветствуются
В контексте Optional
, None
и выш ожидаемый тип уживаются вместе, создавая непрерывное и безопасное выступление.
Особенности подсказок типов
Оценка изменений от Optional
Python постоянно развивается, расширяя возможности указания типов. После Python 3.10 логичным шагом будет замена Optional[Type]
на короче записьType | None
.
Принятие оператора объединения
Оператор объединения |
позволяет описывать подсказки типов как "то или иное", что делает код более понятным и лаконичным. Это прогресс в рамках впечатляющих изменений, принесенных PEP 604!
Подготовка кода к будущему с помощью аннотаций
Уже сегодня используйте язык, который станет стандартом завтра — с помощью from __future__ import annotations
, включая стиль подсказок типов Python 3.10 в ранние версии.
Точные предупреждения о типах
Для предотвращения ошибок во время статической проверки типов важно использовать точные подсказки типов. Применение Optional
и подобных инструментов гарантирует наиболее точные подсказки, которые подобраны идеально, как перчатки к руке.
Полезные материалы
- PEP 484 – Подсказки типов — введение в подсказки типов Python.
- PEP 526 – Синтаксис для аннотаций переменных — развитие аннотаций Python.
- typing — поддержка подсказок типов — документация по
typing.Optional
. - Проверка типов в Python – Real Python — практическое руководство по проверке типов.
- Игровая площадка mypy — праздник экспериментов с подсказками типов Python.
- Учебник по аннотированию типов в Python от Кори Шефера — визуальный урок по аннотированию типов.
- Stack Overflow: Использование подсказок типов Optional — советы от сообщества по работе с
Optional
.