gpt4 book ai didi

Python 类型提示,可索引对象

转载 作者:太空狗 更新时间:2023-10-30 01:19:18 26 4
gpt4 key购买 nike

我的函数需要接受一个对象,可以通过索引从该对象中提取数据,即。 List 或具有定义的 __getitem__ 方法的实例。

我可以使用哪种类型来提示此参数的类型?

更新:据我了解目前没有这样的类型,我尝试自己制作一个:

class IndexableContainer(Generic[int, ReturnType]):
def __getitem__(self, key: int) -> ReturnType:
...

但是我得到以下错误:

  File "indexable_container.py", line 22, in IndexableContainer
class IndexableContainer(Generic[int, ReturnType]):
File ".../lib/python3.6/typing.py", line 682, in inner
return func(*args, **kwds)
File ".../lib/python3.6/typing.py", line 1112, in __getitem__
"Parameters to Generic[...] must all be type variables")
TypeError: Parameters to Generic[...] must all be type variables

我应该怎么做?

最佳答案

有几种不同的方法可以做到这一点。

如果您可以只使用自定义类(您可以编写)作为可索引容器,那么您需要做的就是调整您的代码并删除该“int”类型参数:

class IndexableContainer(Generic[ReturnType]):
def __getitem__(self, key: int) -> ReturnType:
...

class MyCustomContainer(IndexableContainer[ReturnType]):
def __getitem__(self, key: int) -> ReturnType:
# Implementation here

def requires_indexable_container(container: IndexableContainer[ReturnType]) -> ReturnType:
# Code using container here

当然,问题是,如果您想将一个普通的旧列表传递给函数,您将无法这样做,因为列表不会子类化您的自定义类型。

我们也许可以通过巧妙地使用 @overload 装饰器和联合来对某些输入进行特殊处理,但是还有第二种方法,尽管是实验性的,称为 Protocols .

协议(protocol)基本上可以让您使用类型提示以一种理智的方式表达“鸭子类型”:基本思想是我们可以调整 IndexableContainer 使其成为一个协议(protocol)。现在,任何使用适当签名实现 __getitem__ 方法的对象都被视为有效的 IndexableContainer,无论它们是否是该类型的子类。

唯一需要注意的是协议(protocol)目前是实验性的并且(afaik)仅由 mypy 支持。计划是最终将协议(protocol)添加到通用 Python 生态系统中——参见 PEP 544对于具体的提案——但我没有跟踪讨论/不知道它的状态。

无论如何,要使用协议(protocol),请使用 pip 安装 typing_extensions 模块。然后,您可以执行以下操作:

from typing_extensions import Protocol

# ...snip...


class IndexableContainer(Protocol, Generic[ReturnType]):
def __getitem__(self, key: int) -> ReturnType:
...

def requires_indexable_container_of_str(container: IndexableContainer[str]) -> None:
print(container[0] + "a")

a = ["a", "b", "c"]
b = {0: "foo", 2: "bar"}
c = "abc"
d = [1, 2, 3]

# Type-checks
requires_indexable_container_of_str(a)
requires_indexable_container_of_str(b)
requires_indexable_container_of_str(c)

# Doesn't type-check
requires_indexable_container_of_str(d)

关于Python 类型提示,可索引对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48283886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com