以下代码
# -*- 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键。如何声明类型?
答案 0 :(得分:1)
我可能不理解typing
和mypy
模块是如何工作的,但似乎存在某种错误。如果我这样做(例子改编自docs的typing.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_X
和MAPPING_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
错误。
但是,在我看来,您编写的代码应该可以正常工作,这就是错误的症状。