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:调用元类基“函数”对象时出错不可迭代的主要内容,如果未能解决你的问题,请参考以下文章

Django:调用元类库时出错

调用元类基础函数()参数时出错 1 必须是代码而不是 str

TypeError: super(type, obj): obj 必须是类型的实例或子类型,仅当我的元类被导入时

面向对象,元类,控制类,对象的创建

TypeError:调用键函数时“NoneType”对象不可迭代

为啥 Pylint 在元类定义的属性使用上出错?