TypeError: 'ABCMeta' 对象不支持下标操作

7

以下是我的代码:

from collecionts.abc import Sequence
from typing import TypeVar

T = TypeVar('T')
def first(a: Sequence[T]) -> T:
    return a[0]

在我的理解中,我可以将任何类似序列的对象作为参数传递给first函数,例如:
first([1,2,3])

并且它返回了1

然而,它引发了一个TypeError: 'ABCMeta'对象无法进行下标操作。这里出了什么问题?我该如何使其工作,使我有一个使用typing模块的函数,可以获取任何类型的第一个元素?

更新

如果我使用from typing import Sequence,它就可以正常运行,from collections.abc import Sequencefrom typing import Sequence之间有什么区别?


实际上这会产生一个ModuleNotFoundError...修复它后,如果您使用的是Python <3.9,则只会看到TypeError,在这种情况下,您需要使用typing版本而不是abc版本:https://docs.python.org/3/library/typing.html#typing.Sequence - jonrsharpe
这个回答解决了您的问题吗?给集合类型指定类型提示 - MisterMiyagi
1
简而言之:如果您使用的是 Python 3.9 之前的版本,则必须使用相应的通用类型“typing”。 - MisterMiyagi
https://github.com/squidfunk/mkdocs-material/issues/5916 - undefined
2个回答

2

有两件事情。

第一个是,如果您传递的参数不符合您指定的类型,typing模块将不会在运行时引发错误。typing模块有助于提高代码清晰度以及智能感知等方面。

关于您遇到的错误可能是由于您正在使用的Python版本引起的。请尝试升级到Python >= 3.9。


0
似乎Python 3.8和3.9之间有一些差异。
在这个帖子中:https://github.com/squidfunk/mkdocs-material/issues/5916 人们建议进行一些未来的导入。
if sys.version_info >= (3, 9):
    class Test(UserDict[str, int]):
        """Class."""
else:
    class Test(UserDict):
        """Class."""

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接