“列表对象不可调用”

问题描述 投票:1回答: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会在object = objects [x]行上返回错误:'list'对象不可调用。这很奇怪,考虑到没有打电话......

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

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

python list maya callable
1个回答
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']

不要这样做。

© www.soinside.com 2019 - 2024. All rights reserved.