2010-02-09 13 views
37

Ich habe versucht, threading.Condition früher heute, aber es hat nicht geklappt. Hier ist die Ausgabe des Python-Interpreter, wenn ich versuche, die threading.Condition Klasse, Unterklasse:Fehler beim Aufruf der Metaklassen-Basen: function() Argument 1 muss Code sein, nicht str

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

Kann jemand diesen Fehler erklären? Vielen Dank!

Antwort

61

Sie erhalten diese Ausnahme, da trotz ihres klassenähnlichen Namens eine Funktion ist und Sie Funktionen nicht unterteilen können.

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

Diese nicht-sehr-nützlich Fehlermeldung raised on the Python bugtracker war, aber es markiert wurde „reparieren nicht.“

+0

Seltsam, ich dachte nicht, um seinen Typ zu überprüfen. Die Dokumente scheinen ein wenig irreführend zu sein, denn sie sagen (http://docs.python.org/library/threading.html) "class threading.Condition ([lock])", was ein wenig irreführend erscheint. Wie auch immer, danke für das Aufräumen :). –

+1

Ich sehe es auch, wenn Sie fälschlicherweise ein Modul als Basisklasse verwenden: class Befehl (main.cmdroot.list.hosts) und nicht den richtigen Befehl (main.cmdroot.list.hosts.Command) – FDS

+1

Eine andere häufige Ursache ist, wenn abgeleitet von eine Basisklasse, die einen Dekorator hat. Der Decorator kann auch den Typ der Basisklasse in "<'function'>" ändern. –

25

Andere Problem als OP hatte, aber Sie können diesen Fehler auch erhalten, wenn Sie versuchen, von einem Modul statt einer Klasse Unterklasse (z. B. versuchen Sie, My.Module statt My.Module.Class zu erben). Ein Dankeschön an this post dafür, dass ich es herausgefunden habe. wenn Sie machen müssen, zum Beispiel Klasse Foo definierte in einer Datei Foo.py.

TypeError: Error when calling the metaclass bases

For this one, the answer is that you probably named a python class the same thing as the module (i.e., the file) that it's in. You then imported the module and attempted to use it like a class. You did this because you, like me, were probably a Java programmer not that long ago :-). The way to fix it is to import the module.class instead of just the module. Or, for sanity's sake, change the name of the class or the module so that it's more obvious what's being imported.

16

Hinsichtlich ein Modul Subklassen, das ist ein wirklich einfacher Fehler ist Wenn Sie eine Unterklasse von Foo in einer anderen Datei erstellen, wird möglicherweise die folgende (dies ist ein Versuch, ein Modul zu Unterklasse und zu einem Fehler führen wird) versehentlich tun:

import Foo 
class SubclassOfFoo(Foo): 

, wenn Sie wirklich entweder tun müssen, :

from Foo import Foo 
class SubclassOfFoo(Foo): 

oder:

import Foo 
class SubclassofFoo(Foo.Foo): 

Bitte beachten Sie: Diese Antwort sollte ein Kommentar auf die Antwort wirklich sein, das ein Modul Nennungen Subklassen, aber Ic Aufgrund des StackOverflow-Verhaltens, das in diesem Beitrag beschrieben wird, kann dies kein Kommentar sein: https://meta.stackexchange.com/questions/23211/how-do-i-add-a-comment-to-an-answer Stimmen Sie nicht einfach deswegen ab.

+0

Dies ist ein guter Grund, Ihre Module nicht wie Klassen zu benennen :) – Anentropic

2

Gotten in das gleiche Problem. Schließlich gelöst durch einen scharfen Blick auf den Code zu nehmen und das ist, wo die TypeError dass Alarme über einen String statt Code zustande kommt ..

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

„Und“

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

Beachten Sie, dass bestimmte Fehler kommt etwa wegen eines einzelnen Kleinbuchstaben auf den Code "Modell" was wiederum macht es eine Zeichenfolge

Verwandte Themen