簡體   English   中英

如何從Python的yield回調函數中獲取變量

[英]How to get variable out of a yield callback function in Python

我一直在嘗試弄清楚范圍和變量在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

我嘗試使用全局變量,但是內部設置的變量不會變為全局變量。

如何從回調中獲取變量?

您要問的內容看起來非常特定於Scrapy而不是Python,並且在Scrapy Spider中,您想要的內容(阻止一個請求以等待另一個請求的響應)無法通過這種方式工作,這是由於底層的Scrapy機制所致。
雖然可以yield一個Request,但返回的Request對象及其回調僅在將其傳遞到基礎機器之后才得到處理,然后才能將Response結果傳遞到其他解析方法。

如果是OTOH,實際上您只是想從另一個方法中的一種方法獲得數據,並“弄清楚作用域和變量在Python中的工作方式”,只需調用它:

def parse1(self,response):
    return 1

def parse2(self,response):
    returned = self.parse1(response)
    print str(returned)

但是我猜測這不是您的最終目標,您的榜樣很糟糕。

相反,您可能要等待的是等待對parse1的阻止請求, parse1將響應結果返回給parse2 ,在該處您要繼續處理它。 在異步世界中,這是行不通的(它等於時光倒流),而您寧願重構代碼以不需要這種樣式。 或者,如果您發現自己依賴於同步,阻塞,編程模型,則可以使用Scrapy之外的其他工具。

話雖這么說,您可以看看scrapy-inline-requests ,它可以幫助您變得懶惰。 但是要成功使用它,您仍然需要了解更深入的Scrapy系統以及使用此系統可能出現的問題。 避免它可能會在將來為您省去頭痛。 考慮一下自己被警告。
一定要閱讀項目自述文件的“已知問題”,以及這里的自述文件: flake8-inline-requests 。)

使用此方法,您可以擁有內聯請求,並避免編寫多個解析方法,如下所示:

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}

也許嘗試將數據放入meta Request('https://www.example.com', callback=self.parse1, meta={'value': 0}) ,然后使用response.metaparse1獲取它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM