请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于yield和return的问题

https://img1.sycdn.imooc.com//szimg/5bfb463900019a1e08230555.jpg

老师关于这里的yield和return,为什么上面的函数是一个return list,而下面的函数直接由可以yield 一个request请求,如果把上面的return list改为

yield scrapy.FormRequest(
            url=post_url,
            formdata=post_data,
            headers=self.headers,
            callback=self.check_login
        )

或者把下面的yield改成

return [scrapy.Request(url, dont_filter=True, headers=self.headers)]

这样行吗?

正在回答

1回答

bobby 2018-11-26 20:40:59

如果你对python的生成器了解的话 就会知道这里实际上都是可以的, 有yield的方法返回的是一个生成器对象。生成器对象是可以进行for循环调用的,如果一个函数返回的是一个list, list也是可以进行for循环的,python的设计思想就是脱离了类型的概念,比如python不会判断你return的是生成器对象还是list对象或者是dict对象,scrapy只会在返回的对象上进行for循环,所以只要你返回的对象可以for循环就行了,但是for循环产生的对象必须是item或者request对象不然scrapy会报错的

1 回复 有任何疑惑可以回复我~
  • 谢谢老师,我刚好有类似的疑问。在此之上我还有个问题,按我理解,yield相当于await,会给call back建立一个通道,如果这里换成return,是不是就不是异步的了?还是说scrapy.Request()里的callback参数依然自动帮我们实现了异步
    回复 有任何疑惑可以回复我~ 2018-12-20 14:17:44
  • bobby 回复 dongnanzhy #2
    不是的 生成器函数 也是可以return的 但是return之后该方法就结束了, 不能进行for循环进行执行了
    回复 有任何疑惑可以回复我~ 2018-12-21 13:46:12
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信