Редактировать: На другой взгляд на код, я заметил, что эта строка:
start=+portion
необходимо изменить на
start += portion
Это может сделать следующий анализ ненужным ... но я думаю, что может все еще быть проблемой в вашем источнике пены, как объяснено ниже.
Первый вопрос, который я хотел бы задать: вы уверены, что внутри вашего объекта self.client
ничего не меняется между вызовами YieldID
?
Другое беспокойство, которое у меня есть - которое вполне может указывать на что-либо вообще, - это то, что вы, возможно, разместили неверный источник для функции, где возникает Исключение. Трассировка показывает, что исключение возникает во время вызова на append
, но код, который вы включили, предназначен для insert
. Похоже, что исключительное сообщение insert
идентифицирует его как «добавление» из-за ошибки копирования и вставки.
И это еще не все. Предполагая, что я идентифицировал правильное местоположение источника , вот полный источник для append
, который начинается со строки 313:
def append(self, objects):
"""
Append the specified child based on whether it is an
element or an attrbuite.
@param objects: A (single|collection) of attribute(s) or element(s)
to be added as children.
@type objects: (L{Element}|L{Attribute})
@return: self
@rtype: L{Element}
"""
if not isinstance(objects, (list, tuple)):
objects = (objects,)
for child in objects:
if isinstance(child, Element):
self.children.append(child)
child.parent = self
continue
if isinstance(child, Attribute):
self.attributes.append(child)
child.parent = self
continue
raise Exception('append %s not-valid' % child.__class__.__name__)
return self
Здесь Исключение поднимается в строке 334 , а не 331 , как показывает ваша трассировка.
Вы уверены, что используете оригинальную версию suds 0.3.5, а не модифицированную версию? Поскольку оригинальная версия append
имеет интересную разницу с insert
: insert
всегда создает кортеж из своего входного аргумента, который в лучшем случае кажется избыточным:
def insert(self, objects, index=0): // line 337
# ... snip to line 348
objects = (objects,)
, тогда как оригинал append
делает это условно (см. Выше):
if not isinstance(objects, (list, tuple)):
objects = (objects,)
Теперь посмотрите на сообщение в исключении:
: добавить
список недействителен
Это означает, что ребенок, которого он пытался добавить, сам был списком. Но как это могло быть? Если список был передан в качестве входных данных, то мы должны перебирать дочерние элементы этого списка ... которые сами по себе не должны быть списками.
Хм. Возможно, дважды вложенный список был передан в append
в качестве параметра объекта, что, по-видимому, указывает на довольно серьезное повреждение структур данных. (См. Мой первый вопрос.)
Или ...
То, что следует, является чистой спекуляцией, и не может быть правдой ..., если это не ...
Или, может быть, вы используете модифицированную версию Suds, в которой было удалено это условное преобразование в список вместе с итерацией по списку? Это объясняет разницу в 3 строки (331 против 334) между кодом, который вы разместили, и источником, который я нашел в Интернете. Не могли бы вы еще раз проверить используемый вами исходный файл и сообщить нам об этом наверняка?