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

Tim*_*son 19 python typing python-3.5

我想使用一个OrderedDict,其中键是一个枚举,并且该项是某个类.

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

Move = typing.NamedTuple('Move', [('actor', Actor), ('location', Location)])
Run Code Online (Sandbox Code Playgroud)

maj*_*elx 6

问题是关于 3.5,但在 python 3.7.2 中typing.OrderedDict引入。所以你可以写:

from typing import OrderedDict
Movie = OrderedDict[Actor, Location]
Run Code Online (Sandbox Code Playgroud)

或使用 AChampion 建议的向后兼容解决方法

try:
    from typing import OrderedDict
except ImportError:
    from typing import MutableMapping
    OrderedDict = MutableMapping
Movie = OrderedDict[Actor, Location]
Run Code Online (Sandbox Code Playgroud)


Kyl*_*and 5

正如 AChampion 在评论中指出的那样,您可以使用MutableMapping

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

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

class MapActor2Location(OrderedDict, MutableMapping[Actor, Location]):
    pass
Run Code Online (Sandbox Code Playgroud)

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

class MyMap(OrderedDict, MutableMapping([KT, VT])): pass
Run Code Online (Sandbox Code Playgroud)

(注意周围多余的括号[KT, VT]!)

这给出了我认为相当令人困惑的错误:

TypeError: Can't instantiate abstract class MutableMapping with abstract methods __delitem__, __getitem__, __iter__, __len__, __setitem__
Run Code Online (Sandbox Code Playgroud)