Ошибка при вызове баз метакласса: аргумент функции() должен быть кодом, а не str
Я попытался подклассифицировать threading.Condition ранее сегодня, но это не сработало. Вот вывод интерпретатора Python, когда я пытаюсь подклассифицировать threading.Condition class:
>>> 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
Может кто-нибудь объяснить эту ошибку? Спасибо!
Ответы
Ответ 1
Вы получаете это исключение, потому что, несмотря на его классное имя, threading.Condition
является функцией, и вы не можете выполнять функции подкласса.
>>> type(threading.Condition)
<type 'function'>
Это не очень полезное сообщение об ошибке было поднято на Python bugtracker, но было отмечено, что "не будет исправлено".
Ответ 2
Разная проблема, чем у OP, но вы также можете получить эту ошибку, если попытаетесь выполнить подкласс из модуля вместо класса (например, вы пытаетесь наследовать My.Module вместо My.Module.Class). Престижность этот пост, чтобы помочь мне понять это.
TypeError: ошибка при вызове баз метакласса
Для этого ответ заключается в том, что вы, вероятно, назвали класс python то же самое, что и модуль (т.е. файл), в котором он находится. импортировал модуль и попытался использовать его как класс. Вы сделали это потому что вы, как и я, были, вероятно, Java-программистом не так долго тому назад:-). Способ исправления заключается в том, чтобы импортировать module.class вместо просто модуль. Или, ради здравого смысла, измените название класса или модуль, чтобы он стал более очевидным, что импортируется.
Ответ 3
Что касается подклассификации модуля, это очень простая ошибка, если у вас есть,
например, класс Foo, определенный в файле Foo.py.
Когда вы создаете подкласс 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
Взять ту же проблему. Наконец, решив взглянуть на код, и вот где возникает TypeError
, который вызывает тревогу о строке вместо кода.
Class Class_name(models.model): //(gives a TypeError of 'str' type)
"И"
Class Class_name(models.Model): // is the correct one.
Обратите внимание, что ошибка возникает из-за одной строчной буквы кода " Модель", которая, в свою очередь, делает ее строкой