【问题标题】:TypeError: Error when calling the metaclass bases 'function' object is not iterableTypeError:调用元类基“函数”对象时出错不可迭代
【发布时间】: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) 的错误消失了。

标签: python-2.7 import metaclass


【解决方案1】:

我终于解决了我的问题!

这与嵌套导入无关--'

在导入引发错误的两个类中,我定义了 __slots__ :

def __slots__(self): return ("bla", "bli", "blu")

而正确的定义是:

__slots__ = ("bla", "bli", "blu")

由于元类使用 __slots__ 来启动类字典,因此会引发元类错误。

【讨论】:

    猜你喜欢
    • 2015-08-02
    • 2015-09-29
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2018-04-30
    • 2015-11-28
    • 2019-10-18
    • 2020-06-25
    相关资源
    最近更新 更多