«Список объектов не вызывается»

1

В настоящее время я пишу Python-инструмент для Maya. Я использую строку кода, которую я использовал в бесчисленных других разделах других инструментов, и по какой-то причине отказывается работать в этот раз. Я не вижу причин, почему это не так.

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" не может быть вызван. Что странно, учитывая, что звонок не производится...

Любые идеи, которые вызывают эту бездну?

EDIT: Стоит отметить, что если я запускаю объекты печати [x], он возвращает имя объекта как ожидалось...

  • 2
    Пожалуйста, предоставьте фактическое сообщение трассировки. Скопируйте и вставьте его, правильно отформатированный. Весь стек трассировки очень важен.
  • 2
    Вы уверены, что в этой строке выдается ошибка? На самом деле, это не будет работать из-за ошибки отступа. Тело метода должно быть с отступом.
Показать ещё 9 комментариев
Теги:
list
maya
callable

1 ответ

7

Этот вопрос долгое время оставался без ответа, поэтому я попытаюсь помочь любому, кто пытается решить подобную проблему. Учитывая тезис времени и тот факт, что вы не отправили трассировку stack- или отформатировали свой код должным образом, я проигнорирую, что вы указываете, что определенная строка вашего кода отвечает за ошибку. Сначала я продемонстрирую код, который вызывает эту ошибку, и объясните, почему.

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

Эта ошибка возникает из-за того, что переменная a_list указывает на определенный пустой список в памяти. Сам объект списка не может быть вызван. Вызываемый означает, что вы можете выполнить его как функцию или конструктор классов (или объект, который реализовал магический метод __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 есть что-то, что не выполняется до тех пор, пока он не запустит ваш код, и поэтому этот вопрос никогда не был пойман.

Другая возможность, я вижу, что вы перезаписываете встроенный 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']

Не делай этого.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню