我有两种方法应该写入同一个列表。
class MySpider():
def parse_post(self, response):
commentList = []
...
commentList.append(someData)
def parse_comments(self, response):
commentList = []
...
commentList.append(someData)
在这段代码中有两个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
。有关如何在该类的所有方法中访问的单个列表的任何想法吗?
答案 0 :(得分:4)
一种方法是简单地通过其全名(MySpider.commentList
)引用变量:
class MySpider(object):
commentList = []
def parse_post(self, response):
...
MySpider.commentList.append(someData)
def parse_comments(self, response):
...
MySpider.commentList.append(someData)
这样MySpider
的所有实例都会共享相同的变量。
如果您可能有多个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 :(得分:2)
看起来你正在使用Scrapy。如果列表是Item的一部分,我通常使用Request / Response对象的meta参数将该项传递给另一个回调。
答案 2 :(得分:1)
只需self.commentList.append(someData)
(请注意,正常的Python样式是使用comment_list
和some_data
。)
答案 3 :(得分:1)
只需将其设为实例属性:
class MySpider(object):
def __init__(self):
self.comment_list = []
def parse_post(self, response):
...
self.comment_list.append(someData)
实例(按照约定在python中self
,在java中为this
例如)在python中是显式的。
如果在方法之外初始化数组(比如在第二个列表中),则将其设置为类属性(即静态属性),对所有实例都是“全局”的,并且应使用全名{{ 1}}或MySpider.comment_list
如果你想避免类名(例如继承)。由于查找属性,type(self).comment_list
也可以工作(如果在实例级别找不到属性,则查找该类)但区别不太明显(“显式优于隐式”)。