2011-09-12 11 views
3

同じリストに書き込む必要がある2つのメソッドがあります。Pythonでグローバルリストを定義する方法

class MySpider(): 

    def parse_post(self, response): 
     commentList = [] 
     ... 
     commentList.append(someData) 

    def parse_comments(self, response): 
     commentList = [] 
     ... 
     commentList.append(someData) 

このコードには、2つのcommentListリストがありますが、データを追加できる単一のリストが必要です。このクラスのどのメソッドでもこのリストにアクセスしたいです。私は試しました

class MySpider(): 

    commentNum = [] 

    def parse_post(self, response): 
     ... 
     commentList.append(someData) 

    def parse_comments(self, response): 
     ... 
     commentList.append(someData) 

しかし、これは私にエラーglobal name commentList is not definedを与えます。そのクラスのすべてのメソッドでアクセスできる単一のリストを持つ方法はありますか?

class MySpider(object): 

    commentList = [] 

    def parse_post(self, response): 
     ... 
     MySpider.commentList.append(someData) 

    def parse_comments(self, response): 
     ... 
     MySpider.commentList.append(someData) 

MySpiderのすべてのインスタンスが同じ変数共有することになります。この方法:

+1

あなたはテキスト内に「配列」と言っていますが、あなたのコードは正しいです。それはリストです。私はそれを修正しました。 –

+0

用語:「グローバル」はモジュールレベルの変数を指します。 –

答えて

4

一つの方法は、単純にそのフルネーム(MySpider.commentList)で変数を参照することです。

あなたはMySpiderの複数のインスタンスを持っており、各インスタンスはcommentList独自のを持ちたい、そして、単にコンストラクタでそれを作成し、self.commentListとしてそれを参照してください可能性がある場合:

class MySpider(object): 

    def __init__(self):  
     self.commentList = [] 

    def parse_post(self, response): 
     ... 
     self.commentList.append(someData) 

    def parse_comments(self, response): 
     ... 
     self.commentList.append(someData) 

両方のバージョンがで働く希望の場合あなたのケース、私は後者を使用することをお勧めします。

1

ちょうどself.commentList.append(someData)

は(通常のPythonスタイルはしかし、comment_listsome_dataを使用することであることに注意してください。)ん

1

をちょうどそれインスタンス属性ます

class MySpider(object): 
    def __init__(self): 
     self.comment_list = [] 
    def parse_post(self, response): 
     ... 
     self.comment_list.append(someData) 

のインスタンス(中selfをPythonの場合はthisがjavaなど)はPythonで明示的です。

(2番目のリストのように)メソッドの外側で配列を初期化すると、それはすべてのインスタンスに対して「グローバル」なクラス属性(静的なもの)になります。完全名MySpider.comment_listクラス名(継承など)を避けたい場合はtype(self).comment_listを入力します。属性の参照のために、self.comment_listも機能します(属性がインスタンスレベルで見つからない場合、クラスが検索されますが)区別があまり明白ではありません(「明示的」は暗黙的よりも優れています)。

2

あなたはScrapyを使用しているようです。リストがアイテムの一部である場合、私は通常、リクエスト/レスポンスオブジェクトのパラメータmetaを使用して、そのアイテムを別のコールバックに渡します。

関連する問題