【问题标题】:Passing multiple arguments to pool.map using class function使用类函数将多个参数传递给 pool.map
【发布时间】:2016-11-21 21:20:00
【问题描述】:

我正在尝试按照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 个参数。
  • ...我是?我将如何重新格式化以按预期提供参数?

标签: python multithreading python-2.7 python-multiprocessing


【解决方案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]))))

【讨论】:

    猜你喜欢
    • 2014-10-22
    • 2019-07-05
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多