web-dev-qa-db-fra.com

Erreur lors de l'appel des bases de métaclasse: l'argument 1 de la fonction () doit être du code, pas str

J'ai essayé de sous-classer le filetage. Condition plus tôt dans la journée, mais cela n'a pas fonctionné. Voici la sortie de l'interpréteur Python lorsque j'essaie de sous-classer la classe threading.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

Quelqu'un peut-il expliquer cette erreur? Merci!

41
David Underhill

Vous obtenez cette exception parce que, malgré son nom de classe, threading.Condition est une fonction et vous ne pouvez pas sous-classer les fonctions.

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

Ce message d'erreur pas très utile a été généré sur le Python bugtracker , mais il a été marqué "ne résoudra pas".

74
Will McCutchen

Problème différent de celui d'OP, mais vous pouvez également obtenir cette erreur si vous essayez de sous-classe à partir d'un module au lieu d'une classe (par exemple, vous essayez d'hériter de My.Module au lieu de My.Module.Class). Félicitations à cet article pour m'avoir aidé à comprendre cela.

TypeError: erreur lors de l'appel des bases de métaclasses

Pour celui-ci, la réponse est que vous avez probablement nommé une classe python la même chose que le module (c'est-à-dire le fichier) dans lequel il se trouve. Vous avez ensuite importé le module et tenté de l'utiliser comme une classe. Vous avez fait cela parce que vous, comme moi, étiez probablement un Java programmeur il n'y a pas si longtemps :-). La façon de résoudre ce problème consiste à importer le module.class au lieu de simplement le Ou, pour des raisons de raison, changez le nom de la classe ou du module afin qu'il soit plus évident de savoir ce qui est importé.

26
Von

En ce qui concerne le sous-classement d'un module, c'est une erreur vraiment facile à faire si vous avez, par exemple, la classe Foo définie dans un fichier Foo.py. Lorsque vous créez une sous-classe de Foo dans un fichier différent, vous pouvez accidentellement effectuer les opérations suivantes (il s'agit d'une tentative de sous-classe d'un module et entraînera une erreur):

import Foo
class SubclassOfFoo(Foo):

quand vous avez vraiment besoin de faire soit:

from Foo import Foo
class SubclassOfFoo(Foo):

ou:

import Foo
class SubclassofFoo(Foo.Foo):

Veuillez noter: cette réponse devrait vraiment être un commentaire sur la réponse qui mentionne le sous-classement d'un module, mais je n'ai pas pu en faire un commentaire en raison du comportement StackOverflow décrit dans cet article: https: //meta.stackexchange .com/questions/23211/comment-ajouter-un-commentaire-à-une-réponse Ne votez pas simplement à cause de cela.

21
Steve Leibman

Entré dans le même problème. Enfin résolu en jetant un coup d'œil au code et c'est là que le TypeError qui déclenche une alarme au lieu du code ..

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

"Et"

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

Notez qu'une erreur spécifique se produit en raison d'une seule lettre minuscule au code "Model" qui à son tour en fait une chaîne

3
Paul