«Объект списка не вызывается» - PullRequest
1 голос
/ 27 мая 2011

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

Есть идеи, что вызвало эту бешеную проблему?

РЕДАКТИРОВАТЬ: Стоит отметить, что если я запускаю печать объектов [x] , возвращает имя объекта, как и ожидалось ...

1 Ответ

8 голосов
/ 03 января 2014

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

>>> 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__, довольно редко).Вы не выполняете фактический список.

Правильный способ добавить один элемент в список - это добавить (я вижу, что вы оборачиваете элемент в списке, а затем используете метод extends, которыйэто не простой способ сделать это, и, следовательно, вероятно, менее эффективный.)

>>> 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']

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

...