将参数传递给蜘蛛__init __

时间:2015-12-16 12:50:35

标签: python scrapy

cities = ['LED', 'KUL', 'MOW']
sp = AirwaySpider(cities)

给出错误

sp = AirwaySpider(cities)
TypeError: __init__() takes exactly 1 argument (2 given)

来自AirwaySpider代码:

class AirwaySpider(scrapy.Spider):
    def __init__(self, **kw):
        super(AirwaySpider, self).__init__(**kw)
        cities = kw

虽然这样可行

sp = AirwaySpider(domain="sdf")

我理解" self"是为了什么,在C ++中是什么,但不知道这个符号在python中意味着什么,为什么我不能通过dict的列表(在我和#39的例子中传递dict) ;采取代码)是好的。

更新:

如果我更改代码以传递原始单个参数,它首先工作,但之后在框架中失败:

class AirwaySpider(scrapy.Spider):
    def __init__(self, kw):
        super(AirwaySpider, self).__init__(kw)

错误

File "airway.py", line 13, in <module>
process.crawl(sp)
...
File "c:\python27\lib\site-packages\scrapy\crawler.py", line 80, in   _create_spider
return self.spidercls.from_crawler(self, *args, **kwargs)
File "c:\python27\lib\site-packages\scrapy\spiders\__init__.py", line 50, in        from_crawler
spider = cls(*args, **kwargs)
exceptions.TypeError: __init__() takes exactly 2 arguments (1 given)
2015-12-16 15:57:29 [twisted] CRITICAL:

2 个答案:

答案 0 :(得分:1)

  

** kwargs允许您将keyworded变量长度的参数传递给函数。如果要在函数中处理命名参数,则应使用** kwargs。

请阅读此链接了解详情:args and kwargs in python explained

因此,要使您的函数工作,需要指定参数的名称:

sp = AirwaySpider(cities=cities)

答案 1 :(得分:1)

def test(a, **args):
    print args  # args is a dict

test(1, prame1=1, parame2=2)

输出:

{'parame2': 2, 'parame1': 1}

**可以以'parame = value'的形式接收所有额外的参数,并将它们转换为dict。

def test(param1, param2):
    print param1
    print param2
param = {'parame1': 1, 'parame2': 2}
test(**param)  
test(prame1=1, parame2=2)  # These two lines are equivalent.

输出:

1
2
1
2

当** dict用作param时,它将被转换为'key = value'