2016-11-21 79 views
0

我試圖按in this post所述的方式進行線程化,並且還通過描述爲here的解決方法在Python 2.7中傳遞多個參數。使用類函數將多個參數傳遞給pool.map

現在,我有這樣的事情,一個函數,pair_scraper類的一部分:

def pool_threading(self): 
     pool = ThreadPool(4) 
     for username in self.username_list: 
      master_list = pool.map(self.length_scraper2, 
       itertools.izip(username*len(self.repo_list), 
       itertools.repeat(self.repo_list))) 

def length_scraper2(self, username, repo): 
    #code 

然而,當我運行我的代碼,我得到的錯誤:

TypeError: length_scraper2() takes exactly 3 arguments (2 given) 

這似乎是因爲它想要self作爲參數傳遞,這是無意義的,因爲我在類中使用了類函數。關於如何解決的想法?

+0

不,那是因爲你只通過1說法。 –

+0

...我是?我將如何重新格式化以便按照預期提供參數? –

回答

1

itertools.izip(username*len(self.repo_list),itertools.repeat(self.repo_list))產生tuple

你需要傳遞2個參數明確你的方法(self隱式傳遞,因爲它是一個非靜態方法),但只通過1元組明確,加上隱含self這使得2個參數,因此令人困惑的錯誤消息。

你必須使用*來傳遞你的元組和2層獨立的參數,如:

master_list = pool.map(self.length_scraper2, 
    *itertools.izip(username*len(self.repo_list),itertools.repeat(self.repo_list))) 

簡單的測試,在一個簡單的功能,採用經典map

def function(b,c): 
    return (b,c) 

print(list(map(function,zip([1,2],[4,5])))) 

錯誤:

print(list(map(function,zip([1,2],[4,5])))) 
TypeError: function() missing 1 required positional argument: 'c' 

現在添加單個星號來展開arg S:

print(list(map(function,*zip([1,2],[4,5])))) 

作品:

[(1, 2), (4, 5)] 

同樣適用於類方法:

class Foo: 
    def function(self,b,c): 
     return (b,c) 

f = Foo() 

print(list(map(f.function,*zip([1,2],[4,5]))))