2013-05-27 109 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文档。