tls*_*nde 3 python generics python-3.9
据我所知,Python 3.9 上的 PEP 585 使用泛型类型与使用打字模块相比是首选,因为大多数打字类型将被弃用。那么这也适用于该Any类型吗?
我从这个问题中看到:typing.Any in Python 3.9 and PEP 585 - Type Hinting Generics In Standard Collections
,在 PEP 585 下使用fromtyping 应该仍然没问题。那么fromtyping 和泛型Any有什么区别Anyany?
似乎任何一种方式都any应该隐式使用类型提示的泛型类型。我对此也不太确定。
在 python 文档中,它说“在下面的示例中,MyIterable 不是通用的,而是隐式继承自 Iterable[Any]:” 那么这是否意味着在类型提示中使用通用 Iterable 将隐式意味着Iterable[any]/ Iterable[Any]?
那么,除了考虑这些问题之外,哪一个是进行类型提示的首选方法呢?
1:
from typing import Any
from collections.abc import Iterable
def some_function(data: list[Any], events: Iterable[Any]) -> None::
...
Run Code Online (Sandbox Code Playgroud)
2:
from collections.abc import Iterable
def some_function(data: list, events: Iterable) -> None::
...
Run Code Online (Sandbox Code Playgroud)
3:
from collections.abc import Iterable
def some_function(data: list[any], events: Iterable[any]) -> None:
...
Run Code Online (Sandbox Code Playgroud)
也是一个旁注。我假设如果您支持版本 3.5-3.9,您总是希望使用输入模块进行类型提示。我主要是因为它仅支持 3.9 及更高版本。
any与打字无关,本身也不是一种类型。它是一个当其可迭代参数的任何元素为 true 时返回 true 的函数。
>>> type(any)
<class 'builtin_function_or_method'>
>>> any([True, True])
True
>>> any([True, False])
True
>>> any([False, False])
False
Run Code Online (Sandbox Code Playgroud)
所以不,你不能替换typing.Any为any。事实上,尝试这样做将会提供一条定制的错误消息mypy:
$ mypy <( echo "x: list[any] = [3]")
/dev/fd/63:1: error: Function "builtins.any" is not valid as a type
/dev/fd/63:1: note: Perhaps you meant "typing.Any" instead of "any"?
Found 1 error in 1 file (checked 1 source file)
Run Code Online (Sandbox Code Playgroud)
(换句话说,与typing.Any 从来没有任何关系any,并且添加__class_getitem__它使得可以使用 来list代替List在这里不适用。)
至于listand list[any](或Iterableand Iterable[Any])之间的区别,我认为没有任何区别。某种类型Iterable可以产生任何类型的值(可以产生的迭代器),就像更明确的Iterable[Any].