Типы Python опциональный может означать обязательный.

Типы Python Опциональный или Обязательный?

“`

ПРОГРАММИРОВАНИЕ НА PYTHON

Узнайте, как избежать частого неправильного использования и непонимания typing.Optional.

Фото от Caroline Hall на Unsplash

Согласно документации Python, typing.Optional – удобный способ указать, что объект может быть None. Это лаконичный и элегантный способ выразить эту концепцию, но ясен ли он?

Перефразирую вопрос: что вы думаете, когда видите слово “optional” в контексте Python? Представьте, что вы видите аргумент с названием “x” и типом “Optional[int]”. Часть “int” достаточно ясна, так как скорее всего указывает на целое число, но что означает “Optional”? Какое ваше первое предположение?

Рассмотрим следующие два варианта:

  1. Мне не нужно указывать значение для “x”, потому что оно является необязательным.
  2. Значение “x” может быть либо “int”, либо “None”.

Если вы достаточно хорошо знакомы с типизацией в Python, то вы знаете, что правильным является второй вариант. Но если вы не знаете… Может быть, я ошибаюсь, но я не могу представить, чтобы человек, не знакомый с Python, выбрал второй вариант. Именно первый вариант кажется наиболее логичным. Когда я вижу информацию о том, что что-то является необязательным, я думаю, что… ну, что оно необязательно…

Эта проблема приводит к частому неправильному использованию типа typing.Optional. В этой статье мы постараемся разъяснить эту ошибку и помочь вам правильно понять этот тип.

Значение типа typing.Optional

Эти три типа намека являются эквивалентными:

from typing import Optional, Unionx: Union[str, None]x: Optional[str]x: str | None

Каждый из них передает одну и ту же информацию: что “x” может быть строкой или “None”. Хотя все они корректны, первый вариант (“Union[str, None]”) представляет ранние стадии типизации в Python: это был первоначальный подход, но сейчас не обязательно предпочтительный метод. Затем, добавили “Optional” в модуль “typing”, чтобы предоставить более лаконичный и прямолинейный способ выразить эту концепцию. Согласно документации mypy:

Вы можете использовать модификатор типа “Optional” для определения варианта типа, который может быть “None”, например “Optional[int]” (“Optional[X]” является предпочтительным сокращением для “Union[X, None]”).

“`