簡體   English   中英

無法迭代Python中的列表類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM