Ошибка при вызове баз метаклассов: аргумент function () 1 должен быть кодом, а не str - PullRequest
41 голосов
/ 09 февраля 2010

Я пытался разделить потоки на подклассы. Условие ранее сегодня, но не получилось Вот вывод интерпретатора Python, когда я пытаюсь создать подкласс 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

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

Ответы [ 4 ]

74 голосов
/ 09 февраля 2010

Вы получаете это исключение, потому что, несмотря на его классоподобное имя, threading.Condition является функцией, и вы не можете выполнять функции подкласса.

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

Это не очень полезное сообщение об ошибке было выдано на багтрекере Python , но помечено как "не исправит".

26 голосов
/ 18 августа 2010

Другая проблема, чем у OP, но вы также можете получить эту ошибку, если попытаетесь создать подкласс из модуля вместо класса (например, вы попытаетесь наследовать My.Module вместо My.Module.Class). Слава этому посту за помощь в выяснении этого.

TypeError: Ошибка при вызове баз метаклассов

Для этого ответ таков: вы, вероятно, назвали класс python то же самое, что модуль (т.е. файл), в котором он находится. импортировал модуль и попытался использовать его как класс. Ты сделал это потому что вы, как и я, вероятно, были программистом Java не так долго тому назад :-). Способ исправить это - импортировать module.class вместо просто модуль. Или, ради здравомыслия, измените название класса или модуль, чтобы было более очевидно, что импортируется.

20 голосов
/ 12 июня 2013

Что касается подклассов модуля, это действительно простая ошибка, если вы имеете, например, класс 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 Не голосуйте просто из-за этого.

3 голосов
/ 21 октября 2016

Попал в ту же проблему. Наконец, решенный, внимательно взглянув на код, вот где появляется TypeError, который сигнализирует о строке вместо кода ..

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

"И"

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

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

...