从未达到的收益声明如何产生影响?

时间:2019-03-02 13:32:27

标签: python

我有此代码:

 def somefunc(self):
    ...
    if self.mynums>= len(self.totalnums):
        if 1 == 1: return self.crawlSubLinks()
        for num in self.nums:
            if not 'hello' in num: continue
            if 0 == 1:
               #if though this is never reached, when using yield, the crawler stops execution after the return statement at the end.
               #When using return instead of yield, the execution continues as expected - why?
               print("in it!"); 
               yield SplashRequest(numfunc['asx'], self.xo, endpoint ='execute', args={'lua_source': self.scripts['xoscript']})

    def crawlSubLinks(self):
        self.start_time = timer()
        print("IN CRAWL SUB LINKS")
        for link in self.numLinks:
            yield scrapy.Request(link callback=self.examinenum, dont_filter=True)

如您所见,SplashRequest从未到达,因此在这种情况下其实现并不重要。因此,目标是通过返回self.crawlSubLinks来继续发送请求。现在是问题所在:

当我在从未达到的return之前使用SplashRequest时,搜寻器将通过处理来自crawlSubLinks的新请求来按预期继续执行。但是,由于某些原因,当我在从未达到的yield之前使用SplashRequest时,搜寻器会在return语句之后停止!是在从未执行的行中使用yield还是return都无关紧要,对吧?

这是为什么?有人告诉我,这仅与Python的行为有关。但是,如何在for循环中包含yield语句,同时又在for循环上方的if语句中返回并且不返回生成器呢?

2 个答案:

答案 0 :(得分:0)

函数中的收益率吗?在函数之外,由于它不是由生成器“屈服”的,因此它将在脚本的开头运行并暂停。

将代码放入函数内,它将不会发生。功能之外的异步内容也是如此。伤了我的头不止一次。

答案 1 :(得分:0)

enter image description here之所以会这样,是因为如果您的函数中有yield语句,该函数将返回生成器