代码之家  ›  专栏  ›  技术社区  ›  David Underhill

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

  •  40
  • David Underhill  · 技术社区  · 14 年前

    今天早些时候,我尝试将threading.condition子类化,但没有成功。下面是当我尝试对线程进行子类化时,Python解释器的输出。Condition类:

    >>> import threading
    >>> class ThisWontWork(threading.Condition):
    ...     pass
    ... 
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: Error when calling the metaclass bases
        function() argument 1 must be code, not str
    

    有人能解释这个错误吗?谢谢!

    4 回复  |  直到 8 年前
        1
  •  70
  •   Will McCutchen    14 年前

    你得到这个例外是因为,尽管它的类名, threading.Condition 是一个函数,不能对函数进行子类化。

    >>> type(threading.Condition)
    <type 'function'>
    

    这条不太有用的错误消息 raised on the Python bugtracker ,但它已标记为“无法修复”。

        2
  •  26
  •   John Mee    8 年前

    与op有不同的问题,但如果尝试从模块而不是类(例如,尝试继承my.module而不是my.module.class),则也会出现此错误。夸赞 this post 帮助我解决这个问题。

    类型错误:调用元类基时出错

    对于这个问题,答案是您可能将一个python类命名为 与它所在的模块(即文件)相同。那么你 已导入模块并尝试像类一样使用它。你做到了 因为你和我一样,可能是一个Java程序员。 前:-)修复它的方法是导入module.class而不是 只是模块。或者,为了理智,改变班级的名字 或者模块,以便更明显地了解导入的内容。

        3
  •  18
  •   Community Sam Holder    7 年前

    对于一个模块的子类化,如果有,这是一个很容易犯的错误, 当您在不同的文件中创建foo的子类时,可能会意外地执行以下操作(这是对模块子类的尝试,并将导致错误):

    import Foo
    class SubclassOfFoo(Foo):
    

    当你真的需要这样做的时候:

    from Foo import Foo
    class SubclassOfFoo(Foo):
    

    或:

    import Foo
    class SubclassofFoo(Foo.Foo):
    

    请注意:这个答案确实应该是对提到模块子类化的答案的注释,但是由于本文中描述的stackoverflow行为,我无法将其作为注释: https://meta.stackexchange.com/questions/23211/how-do-i-add-a-comment-to-an-answer 不要仅仅因为这个就投了反对票。

        4
  •  2
  •   Paul    8 年前

    遇到同样的问题。最后通过仔细查看代码解决了问题,这就是 TypeError 警报是关于字符串而不是代码的。

    Class Class_name(models.model): //(gives a TypeError of 'str' type) 
    

    “和”

    Class Class_name(models.Model): // is the correct one. 
    

    请注意,由于代码只有一个小写字母,所以会出现特定的错误。” 模型 “这反过来又使它成为一个字符串