Python, suds, Ошибка - PullRequest
       1

Python, suds, Ошибка

0 голосов
/ 19 июля 2010

Когда я пытаюсь получить метод из удаленного веб-сервиса, он выдает мне ошибку.

Мой код:

        portion=10
        start=0
        print self.stamp.datetime
        client=self.client
        while 1:
            print 'getting ids...........'
            fresh_ids=client.service.GetTopicsIDsUpdatedAfterDateTime(self.stamp.datetime,start,portion) #this line makes exception
            if len(fresh_ids) is not 0:
                for id in fresh_ids:
                    yield id
                start=+portion
            else:
                print 'No updated topics anymore'
                sys.exit()

Существует обратная трассировка:

 /usr/lib/python2.5/site-packages/suds-0.3.5-py2.5.egg/suds/client.py
in invoke(self, args, kwargs)
    469         binding = self.method.binding.input
    470         binding.options = self.options
--> 471         msg = binding.get_message(self.method, args, kwargs)
    472         timer.stop()
    473         metrics.log.debug(

/usr/lib/python2.5/site-packages/suds-0.3.5-py2.5.egg/suds/bindings/binding.py
in get_message(self, method, args, kwargs)
     96         content = self.headercontent(method)
     97         header = self.header(content)
---> 98         content = self.bodycontent(method, args, kwargs)
     99         body = self.body(content)
    100         env = self.envelope(header, body)

/usr/lib/python2.5/site-packages/suds-0.3.5-py2.5.egg/suds/bindings/rpc.py
in bodycontent(self, method, args, kwargs)
     61             p = self.mkparam(method, pd, value)
     62             if p is not None:
---> 63                 root.append(p)
     64             n += 1
     65         return root

/usr/lib/python2.5/site-packages/suds-0.3.5-py2.5.egg/suds/sax/element.py
in append(self, objects)
    329                 child.parent = self
    330                 continue
--> 331             raise Exception('append %s not-valid' %
child.__class__.__name__)
    332         return self
    333

<type 'exceptions.Exception'>: append list not-valid

В модуле suds есть метод, который вызывает исключение:

def insert(self, objects, index=0):
        """
        Insert an L{Element} content at the specified index.
        @param objects: A (single|collection) of attribute(s) or element(s)
            to be added as children.
        @type objects: (L{Element}|L{Attribute})
        @param index: The position in the list of children to insert.
        @type index: int
        @return: self
        @rtype: L{Element}
        """
        objects = (objects,)
        for child in objects:
            if isinstance(child, Element):
                self.children.insert(index, child)
                child.parent = self
            else:
                raise Exception('append %s not-valid' % child.__class__.__name__)
        return self

ВНа консоли все идет хорошо.Я застрял.

Хорошо, я попытался провести эксперимент:

def YieldID(self):
        portion=10
        start=0
        print self.stamp.datetime
        fresh_ids=self.client.service.GetTopicsIDsUpdatedAfterDateTime(self.stamp.datetime,start,portion) #This work
        while 1:
            print 'getting ids...........'
            fresh_ids=self.client.service.GetTopicsIDsUpdatedAfterDateTime(self.stamp.datetime,start,portion) # This raise exception
            if len(fresh_ids)!=0:
                for id in fresh_ids:
                    yield id
                start=+portion
            else:
                print 'No updated topics anymore'
                sys.exit()

Я добавляю вызов того же метода до того, как он закончится.Но когда он заходит внутрь, тогда дает мне исключение.

Как это может работать до цикла, а не работать внутри цикла? Это главный вопрос.Что изменилось?

Я даже пытался изменить while на for.

1 Ответ

2 голосов
/ 19 июля 2010

Редактировать: На другой взгляд на код, я заметил, что эта строка:

            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) между кодом, который вы разместили, и источником, который я нашел в Интернете. Не могли бы вы еще раз проверить используемый вами исходный файл и сообщить нам об этом наверняка?

...