键入:声明输入时不兼容的类型.Type []

时间:2017-02-03 14:26:22

标签: python typing mypy

以下代码

# -*- coding: utf-8 -*-
import typing


class A(object):
    pass

class B(A):
    pass

class C(A):
    pass

class D(A):
    pass

class E(A):
    pass

MAPPING_X = {
    B: 'b',
    C: 'c',
}
MAPPING_Y = {
    D: 'd',
    E: 'e',
}

all_mappings = {}  # type: typing.Dict[typing.Type[A], str]
all_mappings.update(MAPPING_X)
all_mappings.update(MAPPING_Y)

mypy返回以下错误(python 3.4):

t.py:30: error: Argument 1 to "update" of "dict" has incompatible type Dict[type, str]; expected Mapping[Type[A], str]
t.py:31: error: Argument 1 to "update" of "dict" has incompatible type Dict[type, str]; expected Mapping[Type[A], str]

我不明白如何指定我想要A的子句作为Dict键。如何声明类型?

2 个答案:

答案 0 :(得分:1)

我可能不理解typingmypy模块是如何工作的,但似乎存在某种错误。如果我这样做(例子改编自docstyping.Type部分):

import typing

class User(): pass
class BasicUser(User): pass

def make_new(u: typing.Type[User]) -> User:
    return u()

x = make_new(BasicUser)

没有mypy错误。如果我这样做:

import typing

class A():
    pass

MAPPING_X = {
    A: 'a',
}
all_mappings = {}  # type: typing.Dict[typing.Type[A], str]
all_mappings.update(MAPPING_X)

也没有错误。但是,这确实会产生mypy错误:

import typing

class A():
    pass

class B(A):
    pass

MAPPING_X = {
    A: 'a',
    B: 'b',
}

all_mappings = {}  # type: typing.Dict[typing.Type[A], str]
all_mappings.update(MAPPING_X)

根据我对文档的理解,不应该发生此错误。

答案 1 :(得分:0)

看起来您正确地执行此操作,但需要首先声明MAPPING_XMAPPING_Y的类型。这解决了这个问题。

# -*- coding: utf-8 -*-
import typing

class A(object):
    pass

class B(A):
    pass

class C(A):
    pass

class D(A):
    pass

class E(A):
    pass

MAPPING_X = {}  # type: typing.Dict[typing.Type[A], str]
MAPPING_Y = {}  # type: typing.Dict[typing.Type[A], str]

MAPPING_X = {
    B: 'b',
    C: 'c',
}
MAPPING_Y = {
    D: 'd',
    E: 'e',
}

all_mappings = {}  # type: typing.Dict[typing.Type[A], str]
all_mappings.update(MAPPING_X)
all_mappings.update(MAPPING_Y)

没有mypy错误。

但是,在我看来,您编写的代码应该可以正常工作,这就是错误的症状。