具有泛型键和可调用[T]值的Python字典
我有一些命名元组:具有泛型键和可调用[T]值的Python字典,python,python-3.x,generics,mypy,Python,Python 3.x,Generics,Mypy,我有一些命名元组: JOIN = NamedTuple("JOIN", []) EXIT = NamedTuple("EXIT", []) 我还有一些函数可以处理每种类型的元组: def handleJoin(t: JOIN) -> bool: pass def handleExit(t: EXIT) -> bool: pass 我想做的是创建一个字典handleTuple,这样我就可以这样称呼它: t: Union[JO
JOIN = NamedTuple("JOIN", [])
EXIT = NamedTuple("EXIT", [])
我还有一些函数可以处理每种类型的元组:
def handleJoin(t: JOIN) -> bool:
pass
def handleExit(t: EXIT) -> bool:
pass
我想做的是创建一个字典handleTuple
,这样我就可以这样称呼它:
t: Union[JOIN, EXIT] = #an instance of JOIN or EXIT
result: bool
result = handleTuple[type(t)](t)
我搞不懂的是如何定义这本字典。我试图定义一个通用的T
:
T = TypeVar("T", JOIN, EXIT)
handleTuple: Dict[T, Callable[[T], bool]
然而,我得到一个错误,说“类型变量T是未绑定的”,我不明白。到目前为止,我得到的最接近的结果是:
handleTuple: Dict[Type[Union[JOIN, EXIT]], bool]
handleTuple = {
JOIN: True
EXIT: False
}
这可以按照我想要的方式调用它,但是我无法理解定义中的
Callable
部分,因此我可以包含我的函数。如何做到这一点类型变量仅在别名、类和函数中有意义。可以定义一个:
T=TypeVar(“T”,连接,退出,逆变=True)
类处理程序(协议[T]):
def\uu getitem(self,item:T)->可调用[[T],bool]:
...
handleTuple:Handler={JOIN:handleJoin,EXIT:handleExit}
特殊方法self.\uuu getitem\uuu(item)
对应于self[item]
。因此,协议定义使用item:T
访问handleTuple[item]
的结果是一些可调用[[T],bool]
。MyPy之类的类型检查器理解dict
是该协议的有效实现
由于代码有效地实现了单个分派,因此定义一个分派提供了开箱即用的行为:
@singledispatch
def手柄(t)->bool:
引发未实现的错误
@句柄寄存器
def handleJoin(t:JOIN)->bool:
通过
@句柄寄存器
def handleExit(t:退出)->bool:
通过
工会[加入,退出]
结果:布尔
结果=手柄(t)
FWIW,这可能适用于functools.singledispatch
(“重载”)函数,而不是dict
。这将自动提供正确的静态类型。效果很好,我不得不使用,因为我的函数在一个类中,但我没有在问题正文中包含这一点。谢谢你带我去!你能解释一下协议的方法吗?具体来说,\uu getitem\uu
中有什么内容?文档很漂亮sparse@stybl我在这里添加了一些关于\uuu getitem\uuu
如何工作的解释。如果不清楚,请告诉我。@MisterMiyagi mypy 0.790报告此错误:泛型类型“Handler”[type arg]
对于定义handleTuple
的行,错误消息需要传递--strict to mypy