这个 Python 类型提示语法是什么,括号中的两种类型?

Sub*_*nta 5 python pep

我有一个带有签名的方法,如下所示:

def get_users_for_survey(survey_id: (int, str),show_deleted_users: bool = False) -> list:
    pass
Run Code Online (Sandbox Code Playgroud)

我避开了方法主体,因为我只对survey_id 的类型提示部分感兴趣?看起来这意味着它可以是 int 或 str。我想如果这是意图,那么它应该是survey_id:Union(int,str)。PyCharm 不反对。你认为我错过了 PEP 484 中的某些内容吗?我不认为它是一个元组。

编辑根据此处提供的答案,这只是一个错误。现在我知道这个错误的根源是什么。在同样的方法下一行是:

if survey_id and isinstance(survey_id, (int, str)):
Run Code Online (Sandbox Code Playgroud)

所以你在 isinstance 中看到,如果你想适应多种类型,这是一个有效的语法。这个方法的作者认为这也是一个有效的类型提示语法。这里是一个参考: Python isinstance with multiple types

AKa*_*ala 4

是的,你是对的,这不是有效的 TypeHint 语法,根据PEP484 的有效类型提示语法是

from typing import Union

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

这意味着Survey_id 的类型可以是int 或 str

您问的第二个问题是“为什么 PyCharm 不抱怨它?”

答:

PyCharm 将其视为None类型,而不是将其视为无效的 TypeHint ,这相当于 TypeHint Any意味着它可以是任何类型。

即使您使用此语法作为类型提示(根本无效)

def get_users_for_survey(survey_id: int or str, show_deleted_users: bool = False) -> list:
    pass
Run Code Online (Sandbox Code Playgroud)

尽管如此,不会有警告或错误。