2010-02-09 8 views
37

Intenté subclase de subprocesos. El estado anterior hoy pero no funcionó. Aquí está la salida del intérprete de Python cuando intento subclase de la clase threading.Condition:Error al llamar a las bases de la metaclase: el argumento de la función() 1 debe ser código, no 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 

¿Puede alguien explicar este error? ¡Gracias!

Respuesta

61

Obtiene esa excepción porque, a pesar de su nombre de clase, threading.Condition es una función y no puede crear funciones de subclase.

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

Este mensaje de error no muy útil ha sido raised on the Python bugtracker, pero se ha marcado como "no va a arreglar".

+0

Extraño, no pensé en comprobar su tipo. Los documentos parecen ser un poco engañosos porque dicen (http://docs.python.org/library/threading.html) "class threading.Condition ([lock])", que parece un poco engañoso. De todos modos, gracias por aclarar esto :). –

+1

Lo veo también cuando, por error, uso un módulo como clase base: clase Command (main.cmdroot.list.hosts) en lugar de la orden correcta (main.cmdroot.list.hosts.Command) – FDS

+1

Otra causa común es cuando se deriva de una clase base que tiene un decorador. El decorador puede cambiar el tipo de la clase base a 'tipo <'function'>' también. –

25

Tiene un problema diferente al de OP, pero también puede obtener este error si intenta crear una subclase de un módulo en lugar de una clase (por ejemplo, intenta heredar My.Module en lugar de My.Module.Class). Felicitaciones a this post por ayudarme a resolver esto.

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

Con respecto a la subclasificación de un módulo, esto es un error muy fácil de hacer si usted tiene, por ejemplo, Foo clase definida en un archivo Foo.py. Cuando se crea una subclase de Foo en un archivo diferente, es posible que accidentalmente lo siguiente (esto es un intento de subclase un módulo y dará lugar a un error):

import Foo 
class SubclassOfFoo(Foo): 

cuando realmente tiene que hacer, ya sea :

from Foo import Foo 
class SubclassOfFoo(Foo): 

o:

import Foo 
class SubclassofFoo(Foo.Foo): 

Tenga en cuenta: Esta respuesta realmente debería ser un comentario sobre la respuesta que menciona la subclasificación de un módulo, pero yo ç No debería hacer un comentario debido al comportamiento de StackOverflow que se describe en esta publicación: https://meta.stackexchange.com/questions/23211/how-do-i-add-a-comment-to-an-answer No lo rechacen simplemente por eso.

+0

esta es una gran razón para no nombrar sus módulos como clases :) – Anentropic

2

Tengo el mismo problema. Finalmente resuelto mediante la adopción de una mirada penetrante en el código y aquí es donde los TypeError que las alarmas sobre una cadena en lugar de código se produce ..

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

"Y"

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

en cuenta que viene de error específico sobre debido a una sola letra minúscula al código "Modelo" que a su vez lo convierte en una cadena

Cuestiones relacionadas