Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有泛型键和可调用[T]值的Python字典_Python_Python 3.x_Generics_Mypy - Fatal编程技术网

具有泛型键和可调用[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