Mypy不使用Type [NamedTuple]进行类型检查功能

安德烈·帕里卡(Andrej Palicka)

我有一个函数,该函数接受一个派生自类NamedTuple并将其转换为模式的类。但是,当我在以下代码上运行MyPy时,它将失败Argument 1 to "to_schema" has incompatible type "Type[Foo]"; expected "Type[NamedTuple]"

from typing import NamedTuple, Type


def to_schema(named_tuple: Type[NamedTuple]):
    pass

class Foo(NamedTuple):
    pass


to_schema(Foo) 

有没有办法正确键入代码,以便通过MyPy进行类型检查?

编辑:Python文档声明Type[Foo]接受Foohttps://docs.python.org/3/library/typing.html#typing.Type)的任何子类NamedTuple对于我们的数据模型中的实体,我有多个的子类,因此我正在寻找一种以类型检查的方式注释函数的方法。

迈克尔0x2a

您的代码的根本问题在于这NamedTuple不是实际的类型-实际上,它只是一种特殊的“类型构造函数”,它综合了全新的类和类型。例如,如果您尝试打印的值Foo.__mro__,则会看到(<class '__main__.Foo'>, <class 'tuple'>, <class 'object'>)-NamedTuple根本不存在。

这意味着NamedTuple实际上根本就不是一个有效的类型,就这一点而言,mypy只是让您默默地Type[NamedTuple]开始构建这让我感到有些惊讶

要变通解决此问题,您有几种可能的方法:

  1. 而不要使用Type[NamedTuple],请使用Type[tuple]Type[Tuple[Any]]

    Foo真的一个元组的一个亚型,毕竟。

  2. 如果需要仅在namedtuple中存在的方法或字段,请使用自定义协议。例如,如果您特别需要_asdictnamedtuples中方法,则可以执行以下操作:

    from typing_extensions import Protocol
    
    class NamedTupleProto(Protocol):
        def _asdict(self) -> Dict[str, Any]: ...
    
    def to_schema(x: Type[NamedTupleProto]) -> None: pass
    
    class Foo(NamedTuple):
        pass
    
    to_schema(Foo)
    

    请注意typing_extensions,尽管有计划将协议正式化并在某个时候将其添加到Python中,您仍需要安装第三方库才能使用它。(我忘记了计划是Python 3.7还是3.8)。

  3. 在调用上添加类型忽略或to_schema强制转换以使mypy静音。这不是最大的解决方案,但也是最快的解决方案。

有关相关讨论,请参见此问题基本上,在mypy团队中已经达成共识,有人应该对此NamedTuple做些事情,无论是通过添加错误消息还是通过添加官方认可的协议,但我认为人们太忙于其他任务/错误,无法推动这一发展。 。(因此,如果您无聊并且正在寻找可以做的事情...)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Mypy拒绝使用`type(name,(bases,),{})创建的类型对象

使用宏进行类型检查

python 3:使用mypy进行类型推断?

使用“包含”功能进行错误检查

在Haskell中使用RankNTypes进行类型检查

使用Typescript进行接口类型检查

使用泛型进行Dart类型检查

使用 mypy 进行类型检查,但我无法弄清楚为什么会发生此错误

Mypy:使用较高(个人)类型

如何使用mypy进行排版?

使用IIFE中定义的类型进行WebStorm类型检查

使用泛型和原始类型进行类型检查?

使用类层次结构和mypy进行静态类型测试

如果 mypy 声明返回类型,它是否仅对函数进行类型检查?

仅基于Type实例在Dart中进行类型继承检查

需要使用 Javascript 功能进行选择检查

如何对常规功能进行类型检查

类型检查对象而不使用类型保护?

广泛覆盖运算符(使用“ ==”进行类型检查)

使用PropType对嵌套对象的属性进行类型检查

如何对使用类型提示的功能进行单元测试

XSLT-检查节点是否存在或不使用功能

如何使用mypy构造子类进行输入

检查类型并转换为具体类型以进行功能签名

在python 2和python 3中进行类型检查python NamedTuple

Aurelia强制不使用吸气剂进行脏检查

不使用内置功能对列表进行排序

检查swf url是否可用,或者不使用php get_headers Content-Type

@angular/common/http get-Method 不使用提供的 <type> 返回 Observable - 该类型的实例失败