2011-05-26 29 views
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中對象上返回一個錯誤=對象[X]線:'列表' 對象不是可調用。這是奇怪的,考慮到沒有電話正在作出...

任何想法是什麼導致這個真氣難題?

編輯:它值得一提的是,如果我跑打印對象[X],它返回對象的名稱如預期...

+2

請提供實際的回溯信息。複製並過去,格式正確。整個回溯堆棧非常重要。 – 2011-05-26 22:11:23

+2

你確定錯誤正在被拋出嗎?事實上,由於縮進錯誤,它不會運行。方法體需要縮進。 – recursive 2011-05-26 22:11:39

+7

另外,只是爲了踢,我會提到'對象'是一個非常重要的名字,你可能不應該覆蓋。 – senderle 2011-05-26 22:16:01

回答

6

這個問題已經缺席了很長一段時間無人接聽,所以我會盡力幫助任何試圖解決類似問題的人。考慮到時間的推移以及您沒有正確發佈堆棧跟蹤或格式化代碼的事實,我會忽略您指示您的代碼的特定行負責該錯誤。 首先我將演示一些引發此錯誤的代碼,並解釋原因。

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

出現此錯誤是因爲變量a_list指向內存中的特定空列表。列表對象本身不可調用。 Callable意味着你可以像一個函數或者類的構造函數那樣執行它(或者一個已經實現了神奇方法的對象,而不常見)。你不會執行一個實際的列表。

將單個項目添加到列表的正確方法是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 

在一個解釋,這是很快抓住了,但在瑪雅的東西可能不被執行,直到它運行你的代碼,所以這個問題一直沒有抓到。

另一種可能性,我看到你覆蓋了內建的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'] 

不要這樣做。