Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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 Mypy拒绝使用`type(name,(base,),{}创建的类型对象`_Python_Python 3.x_Types_Python 3.6_Mypy - Fatal编程技术网

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

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

我在让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()
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
。(如果有其他共同点,同样适用。)这并没有多大改进,但比
任何
都略好。