列表对象不可调用
我现在正在为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]这一行报错:'list' object is not callable。这很奇怪,因为这里并没有调用的操作……
有没有人知道是什么原因导致这个让人抓狂的问题?
补充一下,如果我运行print objects[x],它会按预期返回对象的名称……
1 个回答
这个问题已经放了很久没有人回答,所以我来帮帮那些遇到类似问题的人。考虑到时间过去了,而且你没有提供错误的详细信息或格式化你的代码,我就不去讨论你提到的某一行代码导致了错误。
首先,我会展示一些代码,这段代码会引发这个错误,并解释原因。
>>> a_list = []
>>> a_list()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
这个错误出现是因为变量 a_list 指向内存中的一个特定空列表。列表对象本身是不能被调用的。可调用的意思是你可以像调用函数或类构造器那样执行它(或者是实现了 __call__
魔法方法的对象,这种情况比较少见)。你不能直接执行一个列表。
正确的向列表中添加单个项目的方法是使用 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']
不要这样做。