如何通过python 3.5输入模块键入提示collections.OrderedDict

时间:2016-01-12 05:37:25

标签: python python-3.5 typing

我想使用OrderedDict,其中键是枚举,而该项是某个类。

如何使用输入模块来暗示这一点? 什么是这个暗示的namedtuple ::

的类比
Move = typing.NamedTuple('Move', [('actor', Actor), ('location', Location)])

2 个答案:

答案 0 :(得分:4)

如AChampion的评论中所述,您可以使用MutableMapping

class Actor(Enum):
    # ...Actor enum menbers...

class Location:
    # ...Location class body...

class MapActor2Location(OrderedDict, MutableMapping[Actor, Location]):
    pass

对于像我这样没有使用typing模块的人的附录:请注意,类型定义使用索引语法([T]不带括号。我最初尝试过这样的事情:

class MyMap(OrderedDict, MutableMapping([KT, VT])): pass

(请注意[KT, VT]周围无关的括号!)

这给出了我认为相当混乱的错误:

TypeError: Can't instantiate abstract class MutableMapping with abstract methods __delitem__, __getitem__, __iter__, __len__, __setitem__

答案 1 :(得分:1)

问题大约是3.5,但是typing.OrderedDictintroduced in the python 3.7.2。所以你可以这样写:

from typing import OrderedDict
Movie = OrderedDict[Actor, Location]

或具有AChampion建议的向后兼容性解决方法

try:
    from typing import OrderedDict
except ImportError:
    from typing import MutableMapping
    OrderedDict = MutableMapping
Movie = OrderedDict[Actor, Location]