2011-05-26 32 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'] 

不要这样做。