我正在尝试使用pyplurk为Plurk编写一个简单的GUI前端.
我已经成功地创建了API连接,登录,并检索并显示了一个朋友列表.现在我正在尝试检索并显示Plurks列表.
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())
Run Code Online (Sandbox Code Playgroud)
如您所见,这会返回一个PlurkPostList,后者又定义如下:
class PlurkPostList:
'''A list of plurks and the set of users that posted them.'''
def __init__(self, plurk_json_list, user_json_list=[]):
self._plurks = [PlurkPost(p) for p in plurk_json_list]
self._users = [PlurkUser(u) for u in user_json_list]
def __iter__(self):
return self._plurks
def GetUsers(self):
return self._users
def __eq__(self, other):
if other.__class__ != PlurkPostList: return False
if self._plurks != other._plurks: return False
if self._users != other._users: return False
return True
Run Code Online (Sandbox Code Playgroud)
现在我希望能够做到这样的事情:
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)
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我实际得到的是:
<plurk.PlurkPostList instance at 0x01E8D738>
Run Code Online (Sandbox Code Playgroud)
从"打印ps",然后:
for p in ps:
TypeError: __iter__ returned non-iterator of type 'list'
Run Code Online (Sandbox Code Playgroud)
我不明白 - 肯定列表是可迭代的?我哪里错了 - 如何访问PlurkPostList中的Plurks?
Tho*_*ers 14
当您定义自己的__iter__方法时,您应该意识到该__iter__方法应该返回迭代器,而不是迭代.您正在返回列表,而不是列表中的迭代器,因此它会失败.return iter(self._plurks)例如,您可以通过执行操作来修复它.
如果你想做一些更复杂的事情,比如处理self._plurks中的每个项目,因为它正在被迭代,通常的技巧是让你的__iter__方法成为一个生成器.这样,调用的返回值__iter__是生成器,它是一个迭代器:
def __iter__(self):
for item in self._plurks:
yield process(item)
Run Code Online (Sandbox Code Playgroud)
该__iter__方法应返回实现该next()方法的对象.
列表没有next()方法,但它有一个__iter__返回listiterator对象的方法.该listiterator对象有一个next()方法.
你应该写:
def __iter__(self):
return iter(self._plurks)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4704 次 |
| 最近记录: |