Skip to main content
 首页 » 编程设计

python之"List object not callable"

2025年05月04日12sxdcgaq8080

我目前正在为 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],它会按预期返回对象的名称...

请您参考如下方法:

这个问题很久没有回答了,所以我会尽力帮助任何试图解决类似问题的人。考虑到时间的流逝以及您没有发布堆栈跟踪或正确格式化代码的事实,我将忽略您指出代码的特定行是导致错误的原因。 首先,我将演示一些引发此错误的代码,并解释原因。

>>> 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__ 魔术方法的对象,相当不常见)。您不执行实际列表。

将单个项目添加到列表的正确方法是使用追加(我看到您在列表中包装一个项目,然后使用 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 中可能有某些东西在运行您的代码之前不会执行,因此这个问题从未被捕获。

另一种可能性,我发现您正在覆盖内置的对象。如果您尝试调用实例化对象,您会得到类似的错误。

>>> 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 session 。


作为帮助您理解调用列表的反例,它可以(但不应该)实现。

要真正使 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'] 

不要这样做。