0

当我尝试从远程 Web 服务获取方法时,它给了我错误。

我的代码是:

        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 结束之前添加了对相同方法的调用。但是当它进入里面时给了我一个例外。

它如何在循环之前工作,而不是在循环内工作?这是主要问题。发生了什么变化?

我什至尝试更改whilefor.

4

1 回答 1

2

编辑:再看一下代码,我注意到这一行:

            start=+portion

需要改为

            start += portion

这可能会使以下分析变得不必要......但我认为您的 suds 来源中可能仍然存在问题,如下所述。


我要问的第一个问题是:您确定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有一个有趣的区别,总是从其输入参数中创建一个元组,这充其量似乎是多余的:insertinsert

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)。您能否仔细检查您正在使用的源文件,并确定让我们知道?

于 2010-07-19T17:22:56.670 回答