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

Posted

技术标签:

【中文标题】这个 Python 类型提示语法是啥,括号中的两种类型?【英文标题】:What is this Python type hinting syntax, two types enclosed in parenthesis?这个 Python 类型提示语法是什么,括号中的两种类型? 【发布时间】:2020-03-10 10:28:33 【问题描述】:

我有一个签名方法如下:

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 with multiple types

【问题讨论】:

与普遍预期相反,Python 的“类型提示”只是注解。它们实际上可以是任何东西。他们的意思是你想让他们表达的意思。含义:它不必以任何方式“有效”。 【参考方案1】:

是的,你说得对,这不是一个有效的 TypeHint 语法,根据 PEP484 的有效类型提示语法应该是

from typing import Union

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

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

您问的第二个问题是“为什么 PyCharm 不抱怨它。” 回答:

PyCharm 将其视为无效的 TypeHint,而不是将其视为 type None 相当于 TypeHint Any 表示它可以是任何类型。

即使你对类型提示使用这种语法(根本无效)

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

仍然不会出现警告或错误。

【讨论】:

【参考方案2】:

简而言之,python 类型提示正是它所说的那样。键入提示。 Python 不检查类型,但是它们有一些好处:

    它们帮助类型检查器 他们帮助创建文档

来源:https://***.com/a/32558710/9699953(阅读此内容!这是关于类型提示(它是什么,如何使用它))。

【讨论】:

【参考方案3】:

Python“类型提示”实际上并没有这样实现,它们只是注解。你可以用任意的东西注释你的函数和参数:

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

这可以表示任何你想要的意思,你可以将它用于任意目的。 Python 本身并没有用它做任何事情。

我相信类型提示 (int, str) 毫无意义,所以像 PyCharm 这样的类型检查器根本不会抱怨它。

【讨论】:

以上是关于这个 Python 类型提示语法是啥,括号中的两种类型?的主要内容,如果未能解决你的问题,请参考以下文章

常用的打开数据库的两种方法是啥?

python 一条语句后加个中括号是啥意思a=b[b==0]?

Django之模板语法

java中类加载的两种方法是啥?

Visual Studio 中的大括号逗号语法是啥?

Python判断变量的数据类型的两种方法