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:
答案 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'