Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.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
在python 3.6.2中键入.NamedTuple、abc.NamedTuple mixin?_Python_Python 3.6_Namedtuple_Abc_Mypy - Fatal编程技术网

在python 3.6.2中键入.NamedTuple、abc.NamedTuple mixin?

在python 3.6.2中键入.NamedTuple、abc.NamedTuple mixin?,python,python-3.6,namedtuple,abc,mypy,Python,Python 3.6,Namedtuple,Abc,Mypy,我是python新手(3.6.2是我正在使用的版本) 我目前正在将一个DSL实现从Scala移植(尝试移植)到python,用于一些应用python的项目 因此,我正在寻找一种有效地编写不可变类层次结构的方法,以支持使用mypy进行类型检查的方式来表示ADT 我第一次遇到macropy,它复制了python中的scala case类和模式匹配,但只与python 2.7.x兼容(而且无论如何也不能与mypy一起使用) 我做了更多的研究,输入了.NamedTuple和abc.abc。因此,现在我试

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

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

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

我第一次遇到macropy,它复制了python中的scala case类和模式匹配,但只与python 2.7.x兼容(而且无论如何也不能与mypy一起使用)

我做了更多的研究,输入了.NamedTuple和abc.abc。因此,现在我试图找到一种方法,将键入.NamedTuple与abc.abc的优点结合起来,以便能够向NamedTuple添加mixin

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

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运行类型检查,但在C2.m调用中失败(方法调用只返回None)

因此,我进一步搜索,得到了以下集合配方。namedtuple+Mix-In:


我试图将配方从collections.namedtuple调整为typing.namedtuple,但无法理解配方中涉及的相当复杂和脆弱的python机制。有没有什么明显的方法可以使这一点起作用?

C2(…)
不应该真的起作用;ABC应该阻止创建实例。除了namedtuple
\uuuuu new\uuuu
实现屏蔽了ABC
\uuuu new\uuuu
方法,因此不应用常规检查。您必须使用ABC吗?你可以直接把这个方法放在NamedTuple上。事实上,我想用ABC来实现与scala特性相当的东西,即提供一个抽象方法(必须在派生类中实现)的抽象类,同时提供依赖于这个抽象方法的具体方法。这将为我节省大量代码重复。我知道我可以只使用标准类,并在运行时为未实现的方法引发异常,但由于mypy能够在您忘记实现抽象方法时向您发出警告,这对我来说非常理想。测试是否实现了ABC的抽象方法超出了mypy的范围。这可以归结为命名元组和ABC之间的基本不兼容。实际上,mypy生成错误“无法用抽象属性“Foo”实例化抽象类“Foo”,而运行程序在运行时不会产生错误(我创建了一个类Foo,它继承了NamedTuple子类和ABC子类的@abstractmethod)
C2(…)
不应该真正起作用;ABC应该阻止创建实例。除了namedtuple
\uuuu new\uuuu
实现屏蔽了ABC
\uu new\uuuuu
方法,因此不应用常规检查。你必须使用ABC吗?你可以直接将该方法放在namedtuple上。实际上,我想使用ABC来导入元素与scala特性相当的东西,即提供抽象方法的抽象类(必须在派生类中实现),同时提供依赖于此抽象方法的具体方法。这将节省大量代码重复。我知道我可以使用标准类,并在运行时为未实现的方法引发异常,但由于mypy能够在您忘记实现抽象方法时向您发出警告,这对我来说非常理想实际上,ABC的抽象方法的实现超出了mypy的范围。这可以归结为命名元组和ABC之间的基本不兼容。实际上,mypy生成错误“无法实例化抽象属性为“Foo”的抽象类“Foo”,而运行程序在运行时不会产生错误(我创建了一个类Foo,它用@abstractmethod继承NamedTuple子类和ABC子类)