2017-01-14 14 views
-1

Я пытаюсь изменить следующий код, чтобы MyCollection завербовал словарь. Мне еще нужно реализовать итераторы и следующих методов, чтобы иметь функциональность «для элементов в коллекции». Я знаю, что это можно легко сделать путем повторения значений, но я должен сделать это так. Кто-нибудь может мне помочь ?Итеративная коллекция Python, которая обертывает словарь

class MyCollection: 
    def __init__(self): 
     self._data = [] // should be {} 

    def __iter__(self): 
      ''' 
     Return an iterator 
     ''' 
     self._iterPoz = 0 
     return self 

    def __next__(self): 
     ''' 
     Returns the next element of the iteration 
     ''' 
     if self._iterPoz >= len(self._data): 
      raise StopIteration() 
     rez = self._data[self._iterPoz] 
     self._iterPoz = self._iterPoz + 1 
     return rez 
+2

Если вы хотите, чтобы пользователь итерацию по внутренним данным, только 'вернуть ИТЭР (self._data)' 'для __iter__' и тогда вам не нужно предоставлять' __next__'. – jonrsharpe

+1

@jonrsharpe - хорошая точка, но похоже, что он хочет итерации значений, а не ключей, поэтому 'return iter (self._data.values ​​())'. – tdelaney

+1

Его трудно сделать, индексируя, потому что индексы индексируются по их именам. Вам нужно будет захватить список имен, но тогда вы рискуете изменить dict во время итерации и поднять «KeyError». Я не думаю, что мы можем ответить на этот вопрос без каких-либо подробностей о том, почему у вас такое странное ограничение и что именно это ограничение. – tdelaney

ответ

0

Это начинается с конструктивного решения. Когда вы повторяете MyCollection, какие данные вы хотите? Если его значения в содержащем словаре вы можете вернуть его итератор, а затем вы вообще не реализуете __next__.

class MyCollection: 
    def __init__(self): 
     self._data = {} 

    def __iter__(self): 
      ''' 
     Return an iterator of contained values 
     ''' 
     return iter(self._data.values())