2013-05-27 1 views
1

내가 비동기 네 jsons 얻을 수율 및 작업을 사용파이썬 : 토네이도를 사용하여 발전기 기능에서 돌아 오는 방법?

@gen.engine 
def get_user_data(self, sn, snid, fast_withdrawals): 
    end_timestamp = time.time() 
    start_timestamp = end_timestamp - CONFIG.LOYALITY_LEVELS.PERIOD 

    active_apps_response, total_payments_response, payments_for_period_response, withdrawals_response = yield [ 
     gen.Task(self.http_client.fetch, self.__get_active_apps_url(sn, snid)), gen.Task(self.http_client.fetch, self.__get_total_payments_url(sn, snid)), 
     gen.Task(self.http_client.fetch, self.__get_payments_sum_for_period_url(sn, snid, start_timestamp, end_timestamp)), 
     gen.Task(self.http_client.fetch, self.__get_total_withdrawals_url(sn, snid, fast_withdrawals)) 
    ] 

    active_apps = self.__active_apps_handler(active_apps_response) 
    total_payments = self.__get_total_payments_handler(total_payments_response) 
    payments_for_period = self.__payments_sum_for_period_handler(payments_for_period_response) 
    withdrawals = self.__get_total_withdrawals_handler(withdrawals_response) 

    yield gen.Return(active_apps, total_payments, payments_for_period, withdrawals) 

을하지만 대신 상위 기능을 반환 수율을 사용하는 경우도 발생되었고 나도 그 안에 반환을 사용할 수 없습니다. 그렇다면 호출자 함수 생성기를 만들지 않고도 토네이도에서 함수의 결과를 반환하는 방법은 무엇입니까? 파이썬 2.7을 사용하고 있습니다.

답변

4

값과 산출 값을 반환 할 수 없습니다. 값을 생성 할 때 함수는 생성자를 반환하므로 이미 값을 반환하고 더 반환 할 수 없습니다. 그렇게하는 것은 의미가 없습니다.

StopIteration 예외를 발생시키고 생성기를 종료하기 위해 아무 값도 사용하지 않고 return을 호출 할 수 있지만 값을 반환하는 것은 생성기 내에서 의미 상으로 의미가 없습니다.

가끔씩 생성기를 반환하고 때때로 값을 반환하려면이 함수를 호출하여 생성 된 생성자 또는 대체 값을 반환하는 다른 함수로 함수를 래핑하십시오. 일반적으로 디자인 관점에서 볼 때 나쁜 생각입니다.

0

어쩌면 당신은 다음과 같이 쓸 수 있습니다 :

@gen.coroutine 
def get_user_data(self, sn, snid, fast_withdrawals): 
    end_timestamp = time.time() 
    start_timestamp = end_timestamp - CONFIG.LOYALITY_LEVELS.PERIOD 

    active_apps_response, total_payments_response, payments_for_period_response, withdrawals_response = yield [ 
    self.http_client.fetch(self.__get_active_apps_url(sn, snid)), 
    self.http_client.fetch(self.__get_total_payments_url(sn, snid)), 
    self.http_client.fetch(self.__get_payments_sum_for_period_url(sn, snid, start_timestamp, end_timestamp)), 
    self.http_client.fetch(self.__get_total_withdrawals_url(sn, snid, fast_withdrawals)) 
] 

active_apps = self.__active_apps_handler(active_apps_response) 
total_payments = self.__get_total_payments_handler(total_payments_response) 
payments_for_period = self.__payments_sum_for_period_handler(payments_for_period_response) 
withdrawals = self.__get_total_withdrawals_handler(withdrawals_response) 

raise gen.Return(active_apps, total_payments, payments_for_period, withdrawals) 

를 엔진은 이전 인터페이스입니다; 자세한 내용은 토네이도 3.0 문서를 참조하십시오.