web-dev-qa-db-ja.com

メタクラスベースを呼び出すときのエラー:function()引数1はstrではなくコードでなければなりません

今日、スレッドのサブクラス化を試みましたが、条件はうまくいきませんでした。 threading.Conditionクラスをサブクラス化しようとしたときのPythonインタープリターの出力は次のとおりです。

>>> 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

誰かがこのエラーを説明できますか?ありがとう!

41
David Underhill

クラスに似た名前であるにもかかわらず、threading.Conditionは関数であり、関数をサブクラス化することはできません。

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

このあまり役に立たないエラーメッセージは Python bugtracker で発生しましたが、「修正しない」とマークされています。

74
Will McCutchen

OPとは異なる問題がありますが、クラスの代わりにモジュールからサブクラス化しようとすると(たとえば、My.Module.Classの代わりにMy.Moduleを継承しようとすると)、このエラーが発生することもあります。 この投稿 に感謝します。

TypeError:メタクラスベースを呼び出すときのエラー

この場合の答えは、おそらくpythonクラスをモジュール(つまりファイル)と同じものと命名することです。モジュールをインポートし、次のように使用しようとしました。あなたは、私のように、おそらくJavaそれほど昔ではないプログラマーだったからです:-)。これを修正する方法は、ただの代わりにmodule.classをインポートすることです。または、健全性のために、クラスまたはモジュールの名前を変更して、何がインポートされているかがより明確になるようにします。

26
Von

モジュールのサブクラス化に関して、たとえば、ファイルFoo.pyでクラスFooが定義されている場合、これは非常に簡単な間違いです。別のファイルに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 その理由だけで投票しないでください。

21
Steve Leibman

同じ問題に陥りました。最後にコードをよく見てみると、コードではなく文字列について警告するTypeErrorが発生します。

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

"そして"

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

特定のエラーは、コード「Model」の小文字が1文字であるために発生することに注意してください。

3
Paul