如何在Python中从yield回调函数中获取变量

如何在Python中从yield回调函数中获取变量,python,scrapy,Python,Scrapy,我一直在试图弄清楚作用域和变量在Python中是如何工作的。我一直在试图解决这个问题,但我找不到从回调中获取变量的方法 def parse1(self,response): return 1 def parse2(self,response): returned = yield Request( 'https://www.example.com', callback=self.parse1, dont_filter=True

我一直在试图弄清楚作用域和变量在Python中是如何工作的。我一直在试图解决这个问题,但我找不到从回调中获取变量的方法

def parse1(self,response):
    return 1

def parse2(self,response):
    returned = yield Request(
       'https://www.example.com',
       callback=self.parse1,
       dont_filter=True
      )
    print str(returned)
返回

1
我曾尝试使用全局变量,但内部设置的变量不会变成全局变量


如何从回调中获取变量?

可能尝试将数据放入
meta
?像
请求('https://www.example.com“,callback=self.parse1,meta={'value':0})
然后使用
response将其放入
parse1
中。meta

您的请求看起来非常特定于Scrapy而不是Python,在Scrapy Spider中,您需要什么(阻止一个请求以等待另一个请求的响应)由于底层的刮擦机械,无法以这种方式工作。
虽然您可以
生成
请求,但返回的
请求
对象及其回调只会在传递到底层机器之后进行处理,然后才能获得传递给其他解析方法的响应结果

如果,OTOH,您实际上只需要从另一个方法中的一个方法获取数据,并且“了解Python中作用域和变量的工作方式”,只需调用它:

但我猜这不是你真正的目标,你的例子很糟糕

相反,您可能要寻找的是等待对
parse1
的阻塞请求,以将响应结果返回到
parse2
,您希望在那里继续处理它。这在异步世界中不起作用(它等于回到过去),您更希望重构代码,使其不需要这种样式;或者,如果您发现自己依赖于一个同步的、分块的编程模型,那么您可以使用Scrapy以外的东西

然而,尽管如此,你可以看看,这将帮助你懒惰;但要成功地使用它,您仍然需要了解更深层的Scrapy系统,以及使用它可能出现的问题。避免它可能会在将来帮你省去头痛。认为自己受到警告。 (请务必阅读项目自述文件中的“已知问题”,以及此处的自述文件:)

使用此方法,您可以拥有内联请求并避免编写多个解析方法,如下所示:

import scrapy
从内联\u请求导入内联\u请求
类MySpider(scrapy.Spider):
name='myspider'
起始URL=['http://httpbin.org/html']

@内联请求你试过了吗?我知道metas。但这并不能解决我的问题。我需要在parse 2中返回parse 1中的数据。因此,只需将数据放入meta并在parse 1()中得到响应,但我需要在parse 2中而不是在parse 1中得到打印。我不想在parse 1中得到它。我想在parse2中输出一些东西。这是一个非常简单的例子来解释我的问题。
def parse1(self,response):
    return 1

def parse2(self,response):
    returned = self.parse1(response)
    print str(returned)
import scrapy
from inline_requests import inline_requests

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://httpbin.org/html']

    @inline_requests  ###<- using this
    def parse(self, response):
        urls = [response.url]
        for i in range(10):
            next_url = response.urljoin('?page=%d' % i)
            try:
                next_resp = yield scrapy.Request(next_url, meta={'handle_httpstatus_all': True})
                ### you can then do that ^^^^^^^
                urls.append(next_resp.url)
            except Exception:
                self.logger.info("Failed request %s", i, exc_info=True)

        yield {'urls': urls}