函数

时间:2016-07-06 14:17:11

标签: python python-2.7 scrapy global-variables

我知道这个问题看起来和其他许多人一样,因为我只是阅读了所有这些问题并且他们都说要做我已经尝试过的事情,而且它没有奏效(或者我错过了一个微妙的区别我的情况)。这是我的情况:

我正在使用Scrapy和Python 2.7.11编写一个刮刀,我的代码看起来像这样(这是一个复制和粘贴,省略了不相关的行,但我可以根据要求重新添加它们):

class LbcSubtopicSpider(scrapy.Spider):

    ...omitted...

    rawTranscripts = []
    rawTranslations = []

    def parse(self, response):
        #global rawTranscripts, rawTranslations
        rawTitles = []
        rawVideos = []
        for sel in response.xpath('//ul[1]'): #only scrape the first list

        ...omitted...

            index = 0
            for sub in sel.xpath('li/ul/li/a'): #scrape the sublist items
                index += 1
                if index%2!=0: #odd numbered entries are the transcripts
                    transcriptLink = sub.xpath('@href').extract()
                    #url = response.urljoin(transcriptLink[0])
                    #yield scrapy.Request(url, callback=self.parse_transcript)
                else: #even numbered entries are the translations
                    translationLink = sub.xpath('@href').extract()
                    url = response.urljoin(translationLink[0])
                    yield scrapy.Request(url, callback=self.parse_translation)

        print rawTitles
        print rawVideos
        print rawTranslations

    def parse_translation(self, response):
        global rawTranslations
        for sel in response.xpath('//p[not(@class)]'):
            rawTranslation = sel.xpath('text()').extract()
            rawTranslations.append(rawTranslation)

由于未定义全局“rawTranslations”,因此无论何时调用“print rawTranslations”或“rawTranslations.append(rawTranslation)”都会返回错误。

正如我之前所说的那样,我对此进行了广泛的研究,并且几乎互联网上的每个人都说只需在您使用/修改它的任何功能的开头添加“全局(名称)”行(尽管我永远不会分配它,所以我甚至不需要这个)。无论我的全局行是否被注释掉,我都得到相同的结果。这种行为似乎无视我读过的关于全局变量如何在Python中运行的所有内容,所以我怀疑这可能是一个与scrapy函数通过scrapy.Request(....)调用有关的Scrapy怪癖。

抱歉发布看起来像你已经看过很多的同一个问题,但这次似乎有点扭曲,希望有人可以深究它。感谢。

2 个答案:

答案 0 :(得分:8)

在您的情况下,您要访问的变量不是全局变量,而是在类的范围内。

global_var = "global"

class Example:

    class_var = "class"

    def __init__(self):
         self.instance_var = "instance"

    def check(self):
        print(instance_var) # error
        print(self.instance_var) # works
        print(class_var) # error
        print(self.class_var) # works, lookup goes "up" to the class
        print(global_var) # works
        print(self.global_var) # works not

如果要写入全局变量,则只需要global关键字。提示:不要这样做,因为写入的全局变量只能带来痛苦和绝望。仅将全局变量用作(config)常量。

global_var = "global"

class Example:

    def ex1(self):
        global_var = "local" # creates a new local variable named "global_var"

    def ex2(self):
        global global_var
        global_var = "local" # changes the global variable

Example().ex1()
print(global_var) # will still be "global"
Example().ex2()
print(global_var) # willnow be "local"

答案 1 :(得分:0)

如果你想在课堂上使用变量,你可以使用self.xxx

class A:
...     var = []
...     def test(self):
...         self.var.append(10)
...         print self.var