проверка типа диапазона в модуле ввода Python - PullRequest
0 голосов
/ 12 февраля 2019

Речь идет об отсутствии typing.Range.

В пакете typing нет типа для range, но в то же время мы видим typing.re.Match, который является типом, ориентированным на пакет.typing.sequence или typing.Iterable является слишком полным.

Есть ли лучший способ проверить тип range и только тип range?Помимо использования:

range_instance.__class__ == range

update :

Чтобы было ясно, я имею в виду, что некоторые типы при наборе включают все элементы или аспекты чего-либо, например typeing.Iterable (универсальный тип, это нормально)

С другой стороны, есть также очень специфические типы, такие как

typing.Generator, typing.Tuple, typing.Dict,typing.re.Match typing.AsyncContextManager, ...

, но не

typing.Range

Факт 1: тип range - это другой тип в Python (например,диапазон имеет дополнительную оптимизацию для проверки элементов, и иногда имеет смысл знать, имеете ли вы дело со списком или диапазоном)

Факт 2: модуль typing, кажется, охватывает все аспекты типов,(смотрите импорт и логику, если сомневаетесь)

Зная это, я думаю, что typing.Range отсутствует.

Разница между подсказками типов и проверкой типов здесь не имеет значения.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Основная идея typing пакета сегрегация интерфейса .В большинстве случаев вы не должны заботиться о том, является ли передаваемый аргумент объектом range, а о каком-то аспекте его функциональности.В большинстве случаев эта функциональность покрывается typing.Iterable (я не понимаю, что вы подразумеваете под "слишком полным").

С другой стороны, если вы хотите явно проверить тип диапазона, просто используйте isinstance(x, range)

0 голосов
/ 12 февраля 2019

Вы спросили:

Есть ли лучший способ проверить range тип и только range тип, кроме того:

range_instance.__class__ == range

Я думаю, что выдля этого случая можно использовать isinstance() (я проверял это в Python 3.x):

>>> isinstance(range(10), range)
True
>>> isinstance(list(range(10)), range)               # this is a list
False
>>> isinstance([1, 2, 3, 4], range)                  # this is a list
False
>>> isinstance((e for e in range(10)), range)        # this is a generator
False

Как видите, он работает правильно при распознавании объектов диапазона и также незапутаться в списках или генераторах.

...