当我尝试从远程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结束工作之前添加调用相同的方法。但当它进入内部同时给我例外。
它如何在循环之前工作,并且不在循环内工作?这是主要问题。改变了什么?
我甚至尝试将while
更改为for
。
答案 0 :(得分:2)
编辑:再看看代码,我注意到这一行:
start=+portion
需要更改为
start += portion
这可能会使以下分析变得不必要......但我认为可能仍然是你的suds源中的一个问题,如下所述。
我要问的第一个问题是:您确定在调用self.client
之间YieldID
对象内部没有任何变化吗?
我所拥有的另一个问题 - 可能完全没有任何指示 - 是你可能为引发异常的函数发布了错误的来源。回溯显示在调用append
期间引发了异常,但您包含的代码是insert
。看起来好像insert
的异常消息由于复制和粘贴错误而将其标识为“附加”。
还有更多。假设我已经识别出right source location,这里是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
有一个有趣的区别1}}: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)。你能仔细检查一下你正在使用的源文件,并让我们确切知道吗?