я не знаю, почему в этом месте используется функция iter (не __iter__), каково значение iter в этом коде - PullRequest
0 голосов
/ 24 декабря 2009

я не знаю "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)

Я прочитал API:

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

но я также не знаю, что сделала функция 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

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

Ответы [ 2 ]

1 голос
/ 24 декабря 2009

Итератор может быть повторен:

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
0 голосов
/ 24 декабря 2009

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...