Python 类型提示语法是什么,括号中包含两种类型?
What is this Python type hinting syntax, two types enclosed in parenthesis?
我有一个签名如下的方法:
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 中看到,如果你想适应多种类型,这是一个有效的语法。此方法的作者认为这是类型提示的有效语法,因为 well.Here 是一个引用:
Python isinstance with multiple types
简而言之,python 类型提示就是它所说的那样。输入提示。 Python 不检查类型,但是它们对一些事情很有用:
- 他们帮助类型检查
- 他们帮助创建文档
来源:(阅读本文!这是关于类型提示(它是什么,如何使用它))。
Python "type hints" 实际上并没有实现,它们只是 注释 。你可以用任意的东西注释你的函数和参数:
>>> def foo(bar: (int, str)): pass
>>> foo.__annotations__
{'bar': (<class 'int'>, <class 'str'>)}
这可以表示任何你想要的意思,你可以将它用于任意目的。 Python 本身不会用它做任何事情。
我认为类型提示 (int, str)
只是毫无意义,所以像 PyCharm 这样的类型检查器根本不会抱怨它。
是的,你是对的,这不是有效的 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.
你问的第二个问题是"Why PyCharm not complaining about it.?"
答案:
Rather treating it as an invalid TypeHint, the PyCharm treats it as
type None which is equivalent to TypeHint Any means it may be of any type.
即使您将此语法用于类型提示(根本无效)
def get_users_for_survey(survey_id: int or str, show_deleted_users: bool = False) -> list:
pass
仍然不会有警告或错误。
我有一个签名如下的方法:
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 中看到,如果你想适应多种类型,这是一个有效的语法。此方法的作者认为这是类型提示的有效语法,因为 well.Here 是一个引用: Python isinstance with multiple types
简而言之,python 类型提示就是它所说的那样。输入提示。 Python 不检查类型,但是它们对一些事情很有用:
- 他们帮助类型检查
- 他们帮助创建文档
来源:
Python "type hints" 实际上并没有实现,它们只是 注释 。你可以用任意的东西注释你的函数和参数:
>>> def foo(bar: (int, str)): pass
>>> foo.__annotations__
{'bar': (<class 'int'>, <class 'str'>)}
这可以表示任何你想要的意思,你可以将它用于任意目的。 Python 本身不会用它做任何事情。
我认为类型提示 (int, str)
只是毫无意义,所以像 PyCharm 这样的类型检查器根本不会抱怨它。
是的,你是对的,这不是有效的 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.
你问的第二个问题是"Why PyCharm not complaining about it.?"
答案:
Rather treating it as an invalid TypeHint, the PyCharm treats it as type None which is equivalent to TypeHint Any means it may be of any type.
即使您将此语法用于类型提示(根本无效)
def get_users_for_survey(survey_id: int or str, show_deleted_users: bool = False) -> list:
pass
仍然不会有警告或错误。