Python·100 вопросов

Как использовать Optional, Union и | (PEP 604)?

Ответ

В современной экосистеме Python работа с альтернативными типами данных стала значительно проще и лаконичнее благодаря развитию стандартов языка. Раньше для обозначения того, что переменная может принимать определенный тип или отсутствовать вовсе, разработчики были вынуждены импортировать специальный класс Optional из модуля typing. Конструкция вида Optional обозначала ровно то же самое, что и объединение Union, где в качестве второго варианта явно указывался тип None.

Начиная с версии Python 3.10, разработчики получили в свое распоряжение революционный синтаксис на базе вертикальной черты, который был описан в официальном предложении PEP

Теперь вместо громоздких конструкций можно использовать интуитивно понятные выражения вроде str | None для обозначения необязательных значений. Такой же подход применяется и для объединения нескольких возможных типов, поэтому вместо Union теперь пишут int | str, что делает код чище и избавляет от необходимости постоянно импортировать вспомогательные классы для банальных проверок.

При выборе между старым и новым синтаксисом в современном коде настоящим стандартом де-факто является использование оператора вертикальной черты. Он поддерживается во всех актуальных версиях интерпретатора и выглядит гораздо естественнее для программистов, пришедших из других языков программирования. При этом важно помнить, что само по себе указание типа через объединение не избавляет от необходимости писать защитную логику в коде функции.

Всегда проверяйте входящие аргументы на равенство None перед вызовом методов, специфичных для конкретного типа.
Используйте условные операторы или защитные конструкции для разделения логики обработки различных типов данных внутри функции.
Применяйте сужение типов, чтобы статический анализатор понимал текущую ветку выполнения программы.

Грамотная работа с вариативными типами данных позволяет избежать распространенных ошибок времени выполнения и делает код более устойчивым к неожиданным входным данным от пользователей или внешних API.

Полезен ли этот ответ?

Другие вопросы этой темы

Связанные вопросы из других тем