1

現在、Maya 用の Python ベースのツールを作成しています。他のツールの無数の他のセクションで使用したコード行を使用していますが、何らかの理由で今回は機能しません。そうでない理由がわかりません。

def generateClothSkeleton(cloth):
print "Generating Cloth Skeleton"
objects = cmds.textScrollList("clothList", ai=True, q=True)
for x in range(0, len(objects)):
    numVerts = cmds.polyEvaluate((objects[x]), v=True)
    vertPosList = []
    for y in xrange(1, numVerts):
        object = objects[x]
        xformString = object + ".vtx[" + str(y) + "]"
        vertPos = cmds.xform(xformString, t=True, ws=True, a=True, q=True)
        vertPosList.extend([vertPos])
...

実行すると、Python はobject = objects[x] line: 'list' object is not callableでエラーを返します。電話がかけられていないことを考えると、これは奇妙です...

この腹立たしい問題の原因は何ですか?

編集: print objects[x]を実行すると、期待どおりにオブジェクトの名前が返されることに注意してください...

4

1 に答える 1

8

この質問は長い間答えられていないので、同様の問題を解決しようとしている人を助けようとします. 時間の経過と、スタック トレースを投稿したり、コードを適切にフォーマットしたりしなかったという事実を考えると、コードの特定の行がエラーの原因であることを示していることを無視します。最初に、このエラーが発生するコードをいくつか示し、その理由を説明します。

>>> a_list = []
>>> a_list()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

このエラーは、変数 a_list がメモリ内の特定の空のリストを指しているために発生します。リスト オブジェクト自体は呼び出し可能ではありません。__call__Callable とは、関数またはクラス コンストラクター (またはマジック メソッドを実装したオブジェクトのように、かなり珍しい)のように実行できることを意味します。実際のリストは実行しません。

リストに 1 つの項目を追加する適切な方法は、append を使用することです (項目をリストにラップしてから、extend メソッドを使用していることがわかりますが、これは簡単な方法ではないため、効率が悪い可能性があります。 )

>>> a_list.append('foo')

インデックスを使用してそのアイテムを取得できます。

>>> a_list[0]
'foo'

新しい Python 学習者 (または入力が速すぎる専門家) によくある初期の間違いは、括弧の代わりに括弧を使用することであり、同じエラーが発生することがわかります。

>>> a_list(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

インタプリタでは、これはすぐに検出されますが、コードを実行するまで実行されないものが Maya にある可能性が高いため、この問題は検出されませんでした。

別の可能性として、ビルトインを上書きしているようですobject。インスタンス化されたオブジェクトを呼び出そうとすると、同様のエラーが発生します。

>>> an_object = object()
>>> an_object()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'object' object is not callable

listそれで、ビルトインのようなリストコンストラクターを上書きしたのではないかと思いますcmds.textScrollList。その場合は、コードを調べて、次のようなリストを割り当てている可能性のあるケースを探します。

list = ['foo', 'bar'] # Don't do this!!!

修正して、Python セッションを再起動してください。


リストの呼び出しを理解するのに役立つ反例として、リストを実装することはできます(実装すべきではありません)。

実際にlistオブジェクトを呼び出し可能にするには、それをサブクラス化し、__call__メソッドを実装します (これもまた、おそらくプロダクション コードでは行うべきではありません)。この場合、リストに渡す引数でリストを拡張します。

class MyList(list):
    def __call__(self, *args):
        self.extend(args)

>>> a_list = MyList(['foo', 'bar', 'baz'])
>>> a_list('ham', 'spam', 'eggs', 'spam')
['foo', 'bar', 'baz', 'ham', 'spam', 'eggs', 'spam']

これをしないでください。

于 2014-01-03T04:30:02.280 に答える