TypeError:调用元类基“函数”对象时出错不可迭代
Posted
技术标签:
【中文标题】TypeError:调用元类基“函数”对象时出错不可迭代【英文标题】:TypeError: Error when calling the metaclass bases 'function' object is not iterable 【发布时间】:2018-08-23 15:50:35 【问题描述】:我正在处理一个包含多个包和子包的项目,但遇到了导入问题:
Traceback (most recent call last):
File "***/src/dev/dev_salle.py", line 5, in <module>
from src.envir.jeu import Salle
File "***/src/envir/jeu/__init__.py", line 1, in <module>
from camera import Camera
File "***/src/envir/jeu/camera.py", line 5, in <module>
class Camera(object):
TypeError: Error when calling the metaclass bases
'function' object is not iterable
据我了解,它与 Camera 的元类和其他由于嵌套导入而从对象冲突派生的类有关。我注意到的其他一些事情:
如果我将 camera.py 中的 Camera 实例化为 main,错误仍然存在
if __name__ == "__main__":
print Camera()
删除对象继承后错误消失,但我想保留它以使用 __slots__。
如果我在 camera.py 中为 Camera 创建元类 MetaCamera(type),错误仍然存在
如果我调用该错误不会发生
class Blabla(object):pass
if __name__ == "__main__":
print Blabla()
在 ***/src/、***/src/envir/ 或 ***/src/envir/jeu/ 中
我还从另一个子包 Pti(object) 和 Porte(Pti) 导入其他类。 Pti 导入很好,但 Porte 引发此错误:
Traceback (most recent call last):
File "***/src/dev/dev_salle.py", line 5, in <module>
from src.envir.jeu import Salle
File "***/src/envir/jeu/__init__.py", line 2, in <module>
from salle import Salle
File "***/src/envir/jeu/salle.py", line 10, in <module>
from src.envir.elements.pti import Pti, Porte, Monnaie
File "***/src/envir/elements/pti.py", line 14, in <module>
class Porte(Pti):
TypeError: Error when calling the metaclass bases
'function' object is not iterable
结构的回顾,因为它有点乱:
src
|--dev
| '--dev_salle.py
'--envir
|--jeu
| |--camera.py
| '--salle.py
'--elements
'--pti.py
我既不习惯元类也不习惯嵌套导入,所以我有点不知所措......
【问题讨论】:
在继续解决我的问题的同时,我将 jeu 和 elements 包移动到与 dev 相同的级别:Camera 的错误消失但 Porte(Pti) 的错误消失了。 【参考方案1】:我终于解决了我的问题!
这与嵌套导入无关--'
在导入引发错误的两个类中,我定义了 __slots__ :
def __slots__(self): return ("bla", "bli", "blu")
而正确的定义是:
__slots__ = ("bla", "bli", "blu")
由于元类使用 __slots__ 来启动类字典,因此会引发元类错误。
【讨论】:
以上是关于TypeError:调用元类基“函数”对象时出错不可迭代的主要内容,如果未能解决你的问题,请参考以下文章
调用元类基础函数()参数时出错 1 必须是代码而不是 str
TypeError: super(type, obj): obj 必须是类型的实例或子类型,仅当我的元类被导入时