2011-09-12 6 views
3

J'ai deux méthodes qui devraient écrire dans la même liste.Comment définir une liste globale en python

class MySpider(): 

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

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

Dans ce code, il y a deux listes de listes de commentaires, mais j'ai besoin d'une liste unique où je peux ajouter des données. Je veux accéder à cette liste dans n'importe quelle méthode de cette classe. J'ai essayé avec

class MySpider(): 

    commentNum = [] 

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

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

Mais cela me donne une erreur global name commentList is not defined. Des idées comment avoir une seule liste qui peut être consulté dans toutes les méthodes de cette classe?

+1

Vous dites "tableau" dans le texte, mais votre code a raison: c'est une liste. Je l'ai réparé. –

+0

Terminologie: "global" fait référence à une variable de niveau module. –

Répondre

4

Une façon est de se référer simplement à la variable par son nom complet (MySpider.commentList):

class MySpider(object): 

    commentList = [] 

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

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

De cette façon, toutes les instances de MySpider partageront la même variable.

Si vous pourriez avoir plusieurs instances de MySpider, et que vous voulez chaque instance d'avoir son propre commentList, puis créez simplement dans le constructeur et se référer à lui comme 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) 

Si les deux versions travailleraient en votre cas, je suggère d'utiliser ce dernier.

1

Il suffit de faire self.commentList.append(someData)

(Notez que le style normal Python est d'utiliser comment_list et some_data, cependant.)

1

Assurez un attribut d'instance:

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

L'instance (self dans python par convention, this dans java eg) est explicite dans python. Si vous initialisez votre tableau en dehors des méthodes (comme dans votre 2ème liste), vous en faites un attribut de classe (statique), c'est-à-dire "global" pour toutes les instances, et il doit être référencé en utilisant le nom complet MySpider.comment_list ou type(self).comment_list si vous voulez éviter le nom de classe (par exemple pour l'héritage). En raison de la recherche d'attributs, self.comment_list fonctionnera également (si l'attribut n'est pas trouvé au niveau de l'instance, la classe est recherchée) mais la distinction est moins évidente ("explicite vaut mieux qu'implicite").

2

On dirait que vous utilisez Scrapy. Si la liste fait partie d'un élément, je passe généralement cet élément à un autre rappel en utilisant le paramètre meta d'un objet Demande/Réponse.

Questions connexes