2013-10-16 1 views
1

저는 파이썬 irc 봇을 만들고 있습니다. 어떤 이유로 join() 메서드의 yield 문은 메서드를 모두 건너 뜁니다. 그러나 반환 값으로 바꾸면 제대로 작동합니다. 그러나 각 실패한 조인 시도마다 오류를 생성해야합니다.수확량이 작동하지 않지만 반환합니까

어떤 이유로 든 참여가 실패한 경우 서버 오류 명령 코드 응답을 반환하는 봇의 조인 방법이 있습니다. 봇이 성공적으로 조인하면 None입니다.

unsuccessful = bot.join(channels) 

내가 할 수있을 것입니다 : 나는 그것이 실행 "응답을 반환"과 "수율 응답을"전환하면

if unsuccessful: 
    for error in unsuccessful: 
     print(error) 

조인 방법이

def join(self, channels): 
    chan_errors = range(471, 480) # See RFC for commands 471-479 

    if isinstance(channels, str): 
     channels = [channels,] 

    for channel in channels: 
     self.send('JOIN %s' % channel) 
     for response in self.get_response('JOIN', chan_errors): # Verify 
      if response.command in chan_errors: 
       channels.remove(channel) 
       yield response 
    self.channels.append(channels) 

처럼 보인다 방법. 그것은 메시지 생성 메시지를 수신한다

def get_response(self, commands, terminators=None): 
    for msg in self.msg_gen(): 
     self.handle(msg) 
     if msg.command in commands: 
      if terminators is None: 
       return msg 
      yield msg 
     if msg.command in terminators: 
      return msg 

같이

get_response 방법 보인다. 명령은 호출자가 찾고있는 서버 명령이며 터 LN 터는 터 L 널이 발견되면 생성자에서 빠져 나옵니다. 그것은 코 루틴과 같습니다.

여기에 무슨 일이 일어나는지 아는 사람이 있습니까?

+3

'yield'가 무엇이고 발전기를 사용하는 방법을 알고 있습니까? 'bot.join (channels)'은 생성자를 반환합니다; 그 값을 얻기 위해 반복해야합니다. – BrenBarn

+0

@BrenBarn 나는 발전기로서 '실패'를 사용할 것이라는 것을 설명하기 위해 질문을 편집 할 것이다. – user2878309

+1

어떤 방식으로 그것이 "작동하지 않습니까? 그것은 무엇을합니까? 루프에 아무 것도 인쇄하지 않는다는 말입니까? – BrenBarn

답변

4

join 메서드에 yield 문을 넣으면 생성자가됩니다. 생성자 메서드를 호출하면 생성자 함수 만 생성됩니다. 데이터를 얻기 위해 반복해야합니다. 그러나 yield 문을 실행할 때마다 생성기 내에서 실행이 중지되므로 완전히 실행하려면 모든 내용을 모두 사용해야합니다.

코드를 통해 모든 방법을 실행하는이 방법 :

join_gen = bot.join(channels) 
for error_msg in join_gen: 
    print error_msg 

Generators in the Python 2 docs

아니에요 확실히 발전기는 여기에 비록 당신을 위해 좋은 옵션입니다. 첫 번째 오류가 발생했을 때 바로 response을 반환하는 것이 더 좋을 수도 있고, 모든 채널을 통과하려는 경우 오류 목록에 각 오류 응답을 추가하고 완료하면 해당 목록을 반환 할 수 있습니다.

+0

그래, 어쨌든 이걸 가져올 수 없다면 나는 후자와 같이 갈거야. 그렇지 않으면 무의미하게 None을 반복합니다. Java 또는 다른 언어로 돌아가서 배열을 반환해야하는 것과 같습니다. 나는 이것을 다른 곳에서 찾을 수 없다는 것에 놀랐다. 생성기가 iterates 변수에 변수를 추가한다고 생각했습니다. 이것은 이제 의미가 있습니다. – user2878309

+1

링크 Hildreth가 게시 한 [Python yield 키워드 설명] (http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained)은 최고 중 하나입니다 (최고가 아닌 경우)! 파이썬 생성기 용 리소스 - pydocs보다 훨씬 낫다! 전자 만족 그냥 죽일 : D 조 – crennie