繁体   English   中英

Python:如何使用龙卷风从发电机功能返回?

[英]Python: how to return from generator function using tornado?

我使用yield和task异步获取四个json:

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

但是,如果我使用yield,那么return上层函数也变成了generator,我也不能在其中使用return。 那么,如何在不使调用者生成函数的情况下从龙卷风中返回函数结果呢? 我正在使用Python 2.7

您不能同时返回值和屈服值。 当您产生值时,该函数将返回一个生成器-因此它已经返回了一个值,并且无法返回更多值。 这样做根本没有任何意义。

您可以调用不带任何值的return导致StopIteration异常并结束生成器,但是从生成器内部看,从语义上讲,返回值没有意义。

如果您想有时返回一个生成器,有时返回一个值,请用另一个函数包装您的函数,该函数要么返回一个生成器(通过调用此函数创建),要么返回替代值,尽管我认为这样的事情通常不好从设计的角度来看的想法。

也许你可以这样写:

@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文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM