Что это за синтаксис подсказки типа Python, два типа, заключенные в круглые скобки?

У меня есть метод с подписью следующим образом:

def get_users_for_survey(survey_id: (int, str),show_deleted_users: bool = False) -> list:
    pass

Я избегал тела метода, потому что меня интересует только часть подсказки типа для Survey_id? Похоже, это означает, что это может быть либо int, либо str. Я подумал, что если бы это было намерением, то это должно было быть Survey_id: Union(int,str). PyCharm не возражает. Как вы думаете, я что-то пропустил в PEP 484? Я не думаю, что это должен был быть кортеж.

Изменить Согласно приведенным здесь ответам, это просто ошибка. Теперь я знаю, в чем причина этой ошибки. В том же методе следующая строка была:

if survey_id and isinstance(survey_id, (int, str)):

Таким образом, вы видите в isinstance, что если вы хотите разместить несколько типов, это допустимый синтаксис. Автор этого метода считает, что это допустимый синтаксис и для подсказки типа. Вот ссылка: Python isinstance с несколькими типами


person Subhendu Mahanta    schedule 14.11.2019    source источник
comment
Вопреки распространенному мнению, подсказки типов Python — это всего лишь аннотации. Они могут быть буквально любыми. Они означают все, что вы хотите, чтобы они означали. Значение: это не должно быть действительным в любом случае.   -  person deceze♦    schedule 14.11.2019


Ответы (3)


Да, вы правы, это недопустимый синтаксис TypeHint, допустимый синтаксис подсказки типа в соответствии с PEP484 будет

from typing import Union

def get_users_for_survey(survey_id: Union[int, str],show_deleted_users: bool = False) -> list:
    pass

что означает, что идентификатор_опроса имеет тип int или str.

Второй вопрос, который вы задали: "Почему PyCharm не жалуется на это?"

Ответ:

Вместо того, чтобы рассматривать его как недопустимый TypeHint, PyCharm рассматривает его как тип None, который эквивалентен TypeHint Any, что означает, что он может быть любого типа.

Даже если вы используете этот синтаксис для подсказки типа (что вообще недопустимо)

def get_users_for_survey(survey_id: int or str, show_deleted_users: bool = False) -> list:
    pass

тем не менее, не будет никаких предупреждений или ошибок.

person Akay Nirala    schedule 14.11.2019

Короче говоря, подсказка типа Python — это именно то, что он говорит. Введите подсказка. Python не проверяет типы, однако они хороши для нескольких вещей:

  1. Они помогают контролерам типов
  2. Помогают с оформлением документации

Источник: https://stackoverflow.com/a/32558710/9699953 (ПРОЧИТАЙТЕ ЭТО! Речь идет о подсказках типов ( что это такое, как им пользоваться)).

person Sxribe    schedule 14.11.2019

«Подсказки типов» Python на самом деле не реализованы как таковые, это просто аннотации. Вы можете буквально аннотировать свои функции и параметры произвольным образом:

>>> def foo(bar: (int, str)): pass
>>> foo.__annotations__
{'bar': (<class 'int'>, <class 'str'>)}

Это может означать все, что вы хотите, и вы можете использовать его в любых целях. Сам Python ничего с этим не делает.

Я считаю, что подсказка типа (int, str) просто бессмысленна, поэтому средства проверки типов, такие как PyCharm, просто не жалуются на это.

person deceze♦    schedule 14.11.2019