在Python 3.6.2中输入.NamedTuple,abc.NamedTuple mixins?

时间:2017-07-29 16:09:29

标签: python python-3.6 namedtuple abc mypy

我是python的新手(3.6.2是我正在使用的版本)。

我目前正在移植(尝试移植)从Scala到python的DSL实现,用于实施python的一些项目。

所以我正在寻找一种方法来有效地编写不可变类层次结构,以支持使用mypy进行类型检查的方式来表示ADT。

我第一次遇到macropy,它在python中复制了scala case类和模式匹配,但只兼容python 2.7.x(并且无论如何都不适用于mypy)。

我做了一些更多的研究,然后输入了.NamedTuple和abc.ABC。所以现在我想找到一种方法来将types.NamedTuple与abc.ABC的好处结合起来,以便能够将mixins添加到namedtuples。

我希望能够编写这种代码:

from typing import *
from abc import ABC, abstractmethod

class M(ABC):
    @abstractmethod
    def m1(self, it: Iterable[str]) -> str:
        pass

class NT(NamedTuple):
    attr1: str
    attr2: Union[bool, float]

class C1(NT,M):
    def m(self, it: Iterable[str]) -> str:
        return attr1.join(it)

class C2(NT,M):
    pass
c1 = C1('foo',12)
c1.m([str(i) for in in range(10)]) # would work
c2 = C2('bar',12.0)
c2.m([str(i) for in in range(10)]) # would fail because abstractmethod not implemented

上面的代码使用mypy运行typechecks但是在C2.m调用上失败(方法调用只返回None)。

所以我进一步搜索并通过这个配方来收集馆藏。名字小组+混合:abc.namedtuple

我尝试将collections.namedtuple中的配方调整为typing.NamedTuple,但无法将我的脑袋包裹在配方中涉及的相当复杂和脆弱的python机器中。是否有任何明显的方法可以使这项工作?

0 个答案:

没有答案