Python Any 类型与泛型any

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 及更高版本。

che*_*ner 8

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.Anyany。事实上,尝试这样做将会提供一条定制的错误消息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].