2015-12-16 35 views
0
cities = ['LED', 'KUL', 'MOW'] 
sp = AirwaySpider(cities) 

給出了錯誤傳遞參數給蜘蛛__init__

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") 

我明白了「自我「是爲了,在C++中是什麼**,不知道這個符號在python中意味着什麼,以及爲什麼我不能通過dict的列表(字典在我從中獲取代碼的示例中傳遞)是可以的。

UPDATE:

如果我修改代碼,通過它的工作原理第一原始單一的說法,但隨後在框架後失敗

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: 

回答

1

* * kwargs允許您將keyworded變量長度的參數傳遞給函數。如果你想處理函數中的命名參數,你應該使用** kwargs。

閱讀此鏈接的詳細信息:args and kwargs in python explained

所以對於你的函數的工作需要指定參數的名稱:

sp = AirwaySpider(cities=cities)

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

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

輸出:

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

**可以以「參數=值」的形式接收所有額外參數並將其轉換爲字典。

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 

當**字典用作PARAM,它將被轉換爲 '鍵=值'