Python Mypy拒绝使用`type(name,(base,),{}创建的类型对象`
我在让mypy接受类型对象时遇到了一些问题。我是 我确信我只是做错了,但我的谷歌搜索到目前为止还没有找到任何答案Python Mypy拒绝使用`type(name,(base,),{}创建的类型对象`,python,python-3.x,types,python-3.6,mypy,Python,Python 3.x,Types,Python 3.6,Mypy,我在让mypy接受类型对象时遇到了一些问题。我是 我确信我只是做错了,但我的谷歌搜索到目前为止还没有找到任何答案 class Good(object): a = 1 def works(thing: Good): print(thing.a) o = Good() works(o) Bad = type('Bad', (object, ), dict(a=1)) def fails_mypy(thing: Bad): print(thing.a) s = Bad
class Good(object):
a = 1
def works(thing: Good):
print(thing.a)
o = Good()
works(o)
Bad = type('Bad', (object, ), dict(a=1))
def fails_mypy(thing: Bad):
print(thing.a)
s = Bad()
fails_mypy(s)
像“Good
”这样构造的东西是可以的,而像“Bad
”这样构造的东西在mypy检查中失败,原因是:
error: Invalid type "test.Bad"
error: Bad? has no attribute "a"
基于mypy
s wiki的部分,目前不支持这样的类的运行时创建。它无法理解函数定义中的错误。在执行mypy
时,使用leaver\u type(Good)
和leaver\u type(Bad)
可以清楚地说明这一点
通过使用Any
可以消除这些干扰。使用Python 3.6变量注释语法:
Bad: Any = type('Bad', (), {'a':1})
或者,在Python<3.6的情况下:
Bad = type('Bad', (), {'a':1}) # type: Any
(在这两种情况下,任何
都应首先从输入导入
)
当然,这基本上意味着您的函数现在接受任何内容。这是要付出的代价,但这就是使用动态语言所能得到的;由于Bar
是在运行时定义的,理论上它可以是任何东西:-)如果动态创建的类具有某种公共接口,则可以创建一个封装该接口的抽象基类,并将其用作基类之一。然后,您可以使用类型[MyBaseClass]
,而不是使用Any
。(如果有其他共同点,同样适用。)这并没有多大改进,但比任何
都略好。