0

Я пытаюсь выполнить поток, как описано in this post, а также передать несколько аргументов в Python 2.7 через описанный обход here.Передача нескольких аргументов в 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

нет, это потому, что вы передаете только один аргумент. –

+0

... Я? Как мне переформатировать, чтобы дать аргументы, как предполагалось? –

ответ

1

itertools.izip(username*len(self.repo_list),itertools.repeat(self.repo_list)) дает tuple.

Вам необходимо передать два аргумента явно вашему методу (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])))) 
Смежные вопросы