这个程序:
class Array:
def __init__(self, underlying):
self.underlying = underlying
def __class_getitem__(cls, key):
return Array(key)
def __getitem__(self, key):
pass
def __str__(self):
return f"Array({self.underlying=})"
def foo(name, kind):
pass
foo(name="x", kind=Array["int"])
被标记为mypy
:
x.py:17: error: The type "Type[Array]" is not generic and not indexable [misc]
我添加的只是__getitem__
为了看看它是否能解决问题(它没有)。我不打算在这里使用Array
类型(在某种意义上typing
),只是为了用可爱的语法将数组类型传递到其他地方。
这个mypy
错误是什么意思以及如何修复它(最好使用# ignore
评论之外的其他内容)?
__class_getitem__
仅用于打字。请参阅文档:更具体地说:
所以不幸的是,看起来你想要的东西是不可能的。只需使用常规构造函数语法即可
Array("int")
。另外,以防万一您不知道,特殊方法不应该以意想不到的方式使用:
如前所述,
__class_getitem__
保留用于键入泛型。没有保留但仍然可用的是元类的__getitem__
,它允许您提供相同的 API。有了这个,您的示例可以通过引入一个带有 a 的假元类
__getitem__
(mypy Playground,Pyright Playground)来通过类型检查器