“列表对象不可调用”

时间:2011-05-26 22:09:22

标签: python list maya callable

我目前正在为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'对象不可调用。这很奇怪,考虑到没有打电话......

任何想法是什么导致了这个令人愤怒的问题?

编辑:值得注意的是,如果我运行打印对象[x] ,它会按预期返回对象的名称...

1 个答案:

答案 0 :(得分:8)

这个问题已经长时间没有答案,所以我会尝试帮助任何人试图解决类似的问题。鉴于时间的推移以及您没有发布堆栈跟踪或正确格式化代码的事实,我将忽略您指示代码的特定行负责错误。 首先,我将演示一些引发此错误的代码,并解释原因。

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

引发此错误是因为变量a_list指向内存中的特定空列表。列表对象本身不可调用。 Callable意味着您可以像函数或类构造函数(或已实现__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']

不要这样做。