2009-12-24 1 views
0

다음 코드에서 "self._iterator = iter (self._container)"를 모른다. django.http에서왜이 곳에서 iter (__iter__가 아닌) 함수가 사용되는지 모르지만이 코드에서 iter의 평균은 무엇입니까

는 :

반환하는 반복자 객체 :

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를 읽어 보시기 바랍니다. 첫 번째 인수는 두 번째 인수의 존재 여부에 따라 으로 다르게 해석됩니다. 번째 인수없이, O는 반복 프로토콜합니다 ( __iter__() 방법)를 지원하는 컬렉션 오브젝트이거나 그것을 시퀀스 프로토콜 (정수 인자는 0 시작과 __getitem__() 방식)을 지원한다. 해당 프로토콜 중 을 지원하지 않으면 TypeError은 입니다. 두 번째 인수 인 sentinel이 주어지면 o는 호출 가능 객체 여야합니다. 이 경우에 을 작성한 반복자는 next()메소드를 호출 할 때마다 인수가없는 o를 호출합니다. 반환 된 값이 센티넬에 인 경우 StopIteration은 으로, 그렇지 않으면 값이 이 반환됩니다. 의 두 번째 형식 인 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 

당신

답변

1

는 반복자는 반복 될 수 있습니다

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

HttpResponse 감사합니다, 내 영어를 아주 잘하지 않기 때문에, 오히려 텍스트보다 코드를 사용 해보세요 것은 문자열 데이터를 저장할 수있는 클래스입니다. 데이터는 _container이라는 멤버 변수에 저장됩니다.

hr이 데이터 내부에 HttpResponse의 인스턴스라고 가정 해 보겠습니다. iter(hr)에 전화를 걸면 반복기를 다시 얻어야합니다. 이 반복자는 _container 멤버 변수의 데이터를 반환합니다.

이 클래스는 _container 멤버를 "래핑"하여 항상 유니 코드가 아닌 텍스트를 반환 할 수 있습니다. 이 클래스에는 __iter__() 메서드 함수가 있기 때문에 iter()을 호출하면 실제로 __iter__() 메서드 함수가 호출됩니다. 이 메서드 함수는 실제로 _container 멤버 변수에서 iter()을 호출하여 해당 내용의 반복기를 가져옵니다. 그런 다음이 반복자를 _iterator 멤버 변수에 저장하고 self을 반환합니다. 이제 반복 할 준비가되었습니다.

next() 메서드 함수가 정의되어 있습니다. _container 변수의 형식이 유니 코드 인 경우 encode()을 호출하여 유니 코드를 인코딩하고 비 유니 코드를 반환합니다. 다른 멤버 변수 _charset을 사용하여 인코딩에 사용할 charset을 확인합니다.container 변수의 형식이 유니 코드가 아닌 경우 일반 문자열 형식이어야하며 데이터는 변경되지 않고 반환됩니다.

이렇게하면이 클래스에서 "wrapped"된 객체는 반복 될 수 있으며 항상 비 유니 코드 텍스트를 반환합니다.

나는 반복자 프로토콜의 구현에 놀란다. 반복자를 반환 할 때 self을 반환하기 때문에 iter()을 두 번 호출하면 실제로 사용 가능한 반복기가 두 개 반환되지 않습니다. 이것은 위험 할 수있는 것처럼 보입니다. 나는 Django 코드가 그런 것을 결코하지 않는다고 생각한다.

관련 문제