【问题标题】:"List object not callable"“列表对象不可调用”
【发布时间】:2011-09-02 23:52:09
【问题描述】:

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

【问题讨论】:

  • 请提供实际的回溯信息。复制并粘贴它,格式正确。整个回溯栈非常重要。
  • 你确定那条线上有错误吗?实际上,由于缩进错误,这不会运行。方法体需要缩进。
  • 另外,只是为了好玩,我会提到object 是一个非常重要的名称,您可能不应该覆盖它。
  • 奇怪的是,如果我在旧版本的 Maya(2011,而不是 2012)中运行脚本,则不会出现错误。它显然只是那个版本的 Maya 的问题。由于我不需要它专门与 2012 兼容,所以我会坚持使用 2011。
  • 您应该在 Maya 2012 上提交一个错误,以帮助其他用户。

标签: python list maya callable


【解决方案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']

不要这样做。

【讨论】:

    猜你喜欢
    • 2014-11-30
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 2019-01-05
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多