[英]Can't iterate over a list class in Python
我正在嘗試使用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())
如您所見,這會返回一個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
現在我希望能夠做到這樣的事情:
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中的Plurks?
當你定義自己的__iter__
方法時,你應該意識到__iter__
方法應該返回一個迭代器 ,而不是一個迭代器 。 您正在返回一個列表,而不是列表的迭代器,因此它失敗了。 例如,您可以通過return iter(self._plurks)
來修復它。
如果你想做一些更復雜的事情,比如處理self._plurks中的每個項目,因為它被迭代,通常的技巧是讓你的__iter__
方法成為一個生成器 。 這樣,對__iter__
的調用的返回值是生成器,它是一個迭代器:
def __iter__(self):
for item in self._plurks:
yield process(item)
__iter__
方法應該返回一個實現next()
方法的對象。
列表沒有next()
方法,但它有一個__iter__
方法,它返回一個listiterator
對象。 listiterator
對象有一個next()
方法。
你應該寫:
def __iter__(self):
return iter(self._plurks)
作為替代方案,您還可以定義next()
函數並讓__iter__()
返回self。 請參閱構建基本Python迭代器以獲得一個很好的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.