我正在尝试按照in this post描述的方式进行线程化,并且还通过描述here的变通方法在Python 2.7中传递多个参数。
现在我有类似这样的功能,它是类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)
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'
现在添加单个星号以扩展args:
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]))))