Действительно ли «None» и «type(None)» эквивалентны для анализа типов?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Действительно ли «None» и «type(None)» эквивалентны для анализа типов?

Сообщение Anonymous »

В соответствии с частью PEP 484 «Использование None»:

При использовании в подсказке типа выражение None считается эквивалентным type(None).

Однако я столкнулся со случаем, когда оба варианта не кажутся эквивалентными:

Код: Выделить всё

from typing import Callable, NamedTuple, Type, Union

# I define a set of available return types:
ReturnType = Union[
int,
None,
]

# I use this Union type to define other types, like this callable type.
SomeCallableType = Callable[..., ReturnType]

# But I also want to store some functions metadata (including the function's return type) in a `NamedTuple`:
class FuncInfos(NamedTuple):
return_type: Type[ReturnType]

# This works fine:
fi_1 = FuncInfos(return_type=int)

# But this issues an error:
# main.py:21: error: Argument "return_type" to "FuncInfos" has incompatible type "None"; expected "type[int] | type[None]"  [arg-type]
# Found 1 error in 1 file (checked 1 source file)
fi_2 = FuncInfos(return_type=None)

# But this works fine:
fi_3 = FuncInfos(return_type=type(None))
Мне не составляет особых проблем написать type(None) вместо просто None, но мне бы хотелось понять возникшую выше ошибку кажется, это противоречит цитате из PEP 484.
Фрагмент доступен для выполнения здесь.

EDIT : На самом деле, похоже, это сводится к следующему:

Код: Выделить всё

from typing import Type

a: Type[None]

# This seems to cause an issue:
# main.py:4: error: Incompatible types in assignment (expression has type "None", variable has type "type[None]")  [assignment]
# Found 1 error in 1 file (checked 1 source file)
a = None

# This seems to work:
a = type(None)
Фрагмент доступен для выполнения здесь.


Подробнее здесь: https://stackoverflow.com/questions/786 ... e-analysis
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»