我是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机器中。是否有任何明显的方法可以使这项工作?