我试图用pyplurk为Plurk编写一个简单的GUI前端。在
我已经成功地创建了API连接,登录,检索和显示朋友列表。现在我尝试检索并显示plurk列表。在
pyplurk提供了一个GetNewPlurks函数,如下所示:
def GetNewPlurks(self, since):
'''Get new plurks since the specified time.
Args:
since: [datetime.datetime] the timestamp criterion.
Returns:
A PlurkPostList object or None.
'''
offset = jsonizer.conv_datetime(since)
status_code, result = self._CallAPI('/Polling/getPlurks', offset=offset)
return None if status_code != 200 else \
PlurkPostList(result['plurks'], result['plurk_users'].values())
如您所见,它返回一个PlurkPostList,其定义如下:
^{pr2}$现在我希望能做这样的事情:
api = plurk_api_urllib2.PlurkAPI(open('api.key').read().strip(), debug_level=1)
plurkproxy = PlurkProxy(api, json.loads)
user = plurkproxy.Login('my_user', 'my_pass')
ps = plurkproxy.GetNewPlurks(datetime.datetime(2009, 12, 12, 0, 0, 0))
print ps
for p in ps:
print str(p)
当我运行这个程序时,我得到的是:
<plurk.PlurkPostList instance at 0x01E8D738>
从“打印ps”,然后:
for p in ps:
TypeError: __iter__ returned non-iterator of type 'list'
我不明白-一张单子肯定是可写的吗?我哪里出错了-如何访问PlurkPostList中的plurk?在
__iter__
方法应该返回一个实现next()
方法的对象。在列表没有
next()
方法,但有一个__iter__
方法,它返回一个listiterator
对象。listiterator
对象有一个next()
方法。在你应该写:
另外,您还可以定义
next()
函数并让__iter__()
返回self。请参见Build a Basic Python Iterator以获得一个很好的示例。在当您定义自己的
__iter__
方法时,您应该意识到__iter__
方法应该返回一个迭代器,而不是一个iterable。您返回的是列表,而不是列表的迭代器,因此它失败。例如,您可以通过执行return iter(self._plurks)
来修复它。在如果你想做一些更复杂的事情,比如在self中处理每个项目,通常的技巧是让你的
__iter__
方法成为一个生成器。这样,调用__iter__
的返回值就是生成器,它是一个迭代器:相关问题 更多 >
编程相关推荐