я не знаю, почему функция iter (не __iter__) используется в этом месте, что означает iter в этом коде

я не знаю "self._iterator = iter(self._container)" в следующем коде.

в django.http:

class HttpResponse(object):
    def __iter__(self):
        self._iterator = iter(self._container)
        return self

    def next(self):
        chunk = self._iterator.next()
        if isinstance(chunk, unicode):
            chunk = chunk.encode(self._charset)
        return str(chunk)

я прочитал апи:

Возвратите объект итератора. Первый аргумент интерпретируется очень по-разному в зависимости от наличия второго аргумента. Без второго аргумента o должен быть объектом коллекции, который поддерживает протокол итерации (метод __iter__()) или должен поддерживать протокол последовательности (метод __getitem__() с целочисленными аргументами, начинающимися с 0). Если он не поддерживает ни один из этих протоколов, поднимается TypeError. Если задан второй аргумент, sentinel, то o должен быть вызываемым объектом. Итератор, созданный в этом случае, будет вызывать o без аргументов для каждого вызова своего метода next(); если возвращаемое значение равно sentinel, StopIteration будет поднят, в противном случае будет возвращено значение. Одним из полезных применений второй формы iter() является чтение строк файла до тех пор, пока не будет достигнута определенная строка. В следующем примере файл считывается до тех пор, пока не будет достигнуто значение «СТОП»:

но я также не знаю, что сделала функция iter.

i know the __iter__:
class a(object):
    def __init__(self,x=10):
        self.x = x
    def __iter__(self):
        return self
    def next(self):
        if self.x > 0:
                self.x-=1
                return self.x
        else:
                raise StopIteration

Пожалуйста, попробуйте использовать код, а не текст, потому что мой английский не очень хорош, спасибо


person zjm1126    schedule 24.12.2009    source источник


Ответы (2)


Итератор может повторяться:

for item in mylist:
    print item

for key,item in enumerate(mylist):
    print key,":",item

for i in range(0,50):
    print i

Чтобы использовать for item in X, X должен быть итерируемым.

Вы можете сделать свой класс итерируемым, добавив next(self) и т. д., как в вашем образце. Так с

class a(object):
    def __init__(self,x=10):
        self.x = x
    def __iter__(self):
        return self
    def next(self):
        if self.x > 0:
            self.x-=1
            return self.x
        else:
            raise StopIteration

Тогда вы можете сделать

 ainst = a()
 for item in aisnt:
     print item
person Phil H    schedule 24.12.2009

HttpResponse — это класс, который может хранить строковые данные. Данные хранятся в переменной-члене с именем _container.

Предположим, что hr является экземпляром HttpResponse с данными внутри него. Когда вы вызываете iter(hr), вы должны вернуть итератор. Этот итератор будет возвращать данные из переменной-члена _container.

Этот класс «обертывает» член _container, чтобы он всегда мог возвращать текст, отличный от Unicode. Поскольку этот класс имеет функцию метода __iter__(), когда вы вызываете iter(), вы действительно вызываете специальную функцию метода __iter__(). Эта функция метода фактически вызывает iter() для переменной-члена _container, чтобы получить итератор для ее содержимого. Но затем он сохраняет этот итератор в переменной-члене _iterator и возвращает self. Теперь он готов к итерации.

Определена функция метода next(). Если тип переменной _container — Unicode, она вызывает encode() для кодирования Unicode в какой-либо кодировке и возвращает значение, отличное от Unicode. Он использует другую переменную-член, _charset, чтобы узнать, какую кодировку использовать для кодирования. Если тип переменной container не Unicode, это должен быть обычный строковый тип, и данные просто возвращаются без изменений.

Таким образом, объект, «завернутый» в этот класс, может повторяться и всегда возвращать текст, отличный от Unicode.

Я удивлен этой реализацией протокола итератора. Когда он возвращает вам итератор, он просто возвращает self, поэтому, если вы дважды вызовете iter(), вы на самом деле не получите обратно два пригодных для использования итератора. Кажется, это может быть опасно. Я думаю, что код Django никогда не делает ничего подобного.

person steveha    schedule 24.12.2009