2016-07-06 17 views
0

この質問は、ここでは他の多くのものとよく似ています。私はそれらをすべて読んだだけで、すべての人が既に試したことを言うので、私の状況との微妙な違いが見当たりません)。関数内でグローバル変数が認識されない

私は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」が定義されていないため、任意の時点のいずれかの「印刷rawTranslations」または「rawTranslations.append(rawTranslationが)」と呼ばれるエラーを返します。

私が前に言ったように、私はこれをかなり広く見てきました。インターネット上の皆さんは、使用する機能の始めに「グローバル(名前)」行を追加するだけです私はそれにこれまで割り当てていないが、私はこれを必要とすべきではない)。私のグローバルラインがコメントアウトされているかどうかにかかわらず、同じ結果が得られます。この動作は、Pythonでグローバルがどのように動作するかについて私が読んだことのすべてを無視しているようです。これは、scrap.Request(...)を介して構文解析関数が呼び出される方法に関連するScrapyのクォークである可能性があります。

今回も同じ質問が表示されているようですが、今回はちょっとねじれているようですが、誰かがその底に来ることを願っています。ありがとう。

+0

あなたのインデントがオフになっているように見え、例えば使用することができます関数 'parse'は必ずクラス" LbcSubtopicSpider "のメソッドですか?また、rawTranslationsはグローバル属性ではなくクラス属性であるように見えます。もちろん、解決策は 'self.rawTranslations'か' LbcSubtopicSpider.rawTranslations'(文脈に応じて)のどちらかを使うことです。 – syntonym

+0

ここに貼り付けると、インデントが実際に破られました。修正されます。グローバル/クラス属性ポイントについては、違いがあるとは考えていないと思います。これは、おそらくJavaでコーディングされ、クラス内のすべてを実行する製品です。 – jah

+0

'rawTranslations'はグローバルではなく、クラス変数です... – MisterMiyagi

答えて

6

あなたがアクセスしたい変数がグローバルではない場合、クラスのスコープ内にあります。

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" 
0

あなたはクラスの変数を使用したい場合、あなたはself.xxx

class A: 
...  var = [] 
...  def test(self): 
...   self.var.append(10) 
...   print self.var 
関連する問題