Я предполагаю, что Вы пытаетесь сделать интерфейс команды максимально прощающим. Если это верно, я предлагаю, чтобы Вы использовали алгоритм, подобный этому:
Добавить этот метод в библиотеку:
def __iter__(self):
return self.books.itervalues()
Это делегирует итерацию dict, у которого есть простой метод для итерации значений. Прочтите о протоколе итератора, который состоит из методов __ iter __
(для всех итераций) и next
( __ next __
в 3.x) (только для итераторов).
>>> class Library(object):
... def __init__(self):
... self.books = { 'title' : object, 'title2' : object, 'title3' : object, }
... def __getitem__(self, i):
... return self.books[i]
... def __iter__(self):
... return self.books.itervalues()
...
>>> library = Library()
>>> library['title']
<type 'object'>
>>> for book in library:
... print book
...
<type 'object'>
<type 'object'>
<type 'object'>
Вы можете вернуть итератор из ваших внутренних данных:
class Library (object):
...
def __iter__(self):
return self.books.itervalues()
itervalues ()
возвращает итератор к значениям словаря.
Если вам нужен больший контроль, вы можете сделать __ iter __
функцией генератора
class Library (object):
...
def __iter__(self):
for title in self.books:
yield self.books[title]
в этом случае этот генератор дает то же самое, что и итератор в первом примере.