0

Ich versuche, wie beschrieben in this post Thread zu tun, und übergeben Sie auch mehrere Argumente in Python 2.7 durch eine Umgehung beschrieben here.Übergabe mehrerer Argumente an pool.map mit der Klassenfunktion

Im Moment habe ich so etwas wie diese, eine Funktion, die einen Teil der Klasse ist 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 

Allerdings, wenn ich meinen Code ausführen ich den Fehler:

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

Welche scheint sein, weil es self vergangen als Argument will, die gegeben ist unsinnig ich eine Klasse-Funktion innerhalb der Klasse bin mit. Gedanken zur Reparatur?

+0

nein, das ist, weil Sie nur 1 Argument übergeben. –

+0

... ich bin? Wie würde ich umformatieren, um wie beabsichtigt Argumente zu geben? –

Antwort

1

itertools.izip(username*len(self.repo_list),itertools.repeat(self.repo_list)) ergibt ein tuple.

Sie müssen 2 Argumente explizit an Ihre Methode übergeben (self wird implizit übergeben, weil es eine nicht statische Methode ist), aber Sie übergeben nur 1 Tupel, plus die implizite self, die 2 Argumente macht, daher die verwirrende Fehlermeldung .

Sie haben * zu benutzen, um Ihre Tupel als 2 separate Argumente zu übergeben, wie folgt aus:

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

einfachen Test die klassische map auf einer einfachen Funktion:

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

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

Fehler:

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

jetzt das Hinzufügen einzelner Stern arg zu erweitern s:

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

Werke:

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

gleiche gilt für die Klassenmethode:

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

f = Foo() 

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