使用类函数

时间:2016-11-21 21:20:00

标签: python multithreading python-2.7 python-multiprocessing

我正在尝试按照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作为参数传递,这是无意义的,因为我在类中使用了类函数。关于如何解决的想法?

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'

现在添加单个星号以扩展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]))))