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

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

>>> 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 

有人可以解释这个错误? 谢谢!

你会得到这个exception,因为尽pipe它有类名, threading.Condition是一个函数,你不能inheritance函数。

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

这个不是很有用的错误信息已经在Python bugtracker上提出 ,但是它被标记为“不会修复”。

与OP有不同的问题,但如果您尝试从模块而不是类的子类(例如,您尝试inheritanceMy.Module而不是My.Module.Class),也可以得到此错误。 这个职位的荣誉帮助我解决这个问题。

TypeError:调用元类库时发生错误

对于这个,答案是你可能命名了一个python类,就像它所在的模块(即文件)一样。然后你导入了模块并试图像使用类一样使用它。 你这样做是因为你和我一样,可能不是很久以前的Java程序员:-)。 解决这个问题的方法是导入module.class而不是模块。 或者,为了理智,改变类或模块的名称,以便更明显地导入什么。

关于子类化模块,如果你有一个非常容易的错误,例如,在文件Foo.py中定义了类Foo。 在不同的文件中创buildFoo的子类时,可能会意外地执行以下操作(这是尝试对模块进行子类化并导致错误):

 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 /我怎么做,我添加一个评论,一个答案不要只因为这个表决。

陷入了同样的问题。 最后通过对代码进行敏锐的观察来解决这个问题,而TypeError是关于string而不是代码的。

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

“和”

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

请注意,特定的错误是由于代码“ Model ”中的一个小写字母,从而使其成为一个string