В настоящее время я пишу 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], он возвращает имя объекта как ожидалось...
Этот вопрос долгое время оставался без ответа, поэтому я попытаюсь помочь любому, кто пытается решить подобную проблему. Учитывая тезис времени и тот факт, что вы не отправили трассировку 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']
Не делай этого.