Подтвердить что ты не робот

Ошибка при вызове баз метакласса: аргумент функции() должен быть кодом, а не 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

Может кто-нибудь объяснить эту ошибку? Спасибо!

4b9b3361

Ответ 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. 

Обратите внимание, что ошибка возникает из-за одной строчной буквы кода " Модель", которая, в свою очередь, делает ее строкой