2013-05-27 53 views
1

我用產量和任務來獲得異步4個jsons:Python:如何使用龍捲風從發電機功能返回?

@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) 

但是,如果我用產量,而不是返回上層函數成爲生成器也是一樣,我不能太使用的回報。那麼,如何在沒有調用函數發生器的情況下返回龍捲風函數的結果呢? 我正在使用Python 2.7

回答

4

您不能同時返回值和產出值。當你產生值時,函數返回一個生成器 - 所以它已經返回一個值,不能返回更多。這樣做根本沒有意義。

您可以調用return而沒有任何值導致StopIteration異常並結束生成器,但返回值在生成器中從語義上講沒有意義。

如果你想有時返回一個生成器,有時返回一個值,用另一個返回一個生成器(通過調用這個函數創建的)或替代值來包裝你的函數,儘管我不會這麼做從設計的角度來看,這通常是一個壞主意。

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文檔。