2016-05-12 8 views
1

Hier ist ein seltsames Verhalten in Python begegnete ich ein Skript heute zu erkennen, läuft 2.7:Python andernfalls die Anzahl der Argumente meiner Funktion

Code 1:

def pprint_compare_titles (self, ts_numbers = [1], **kwargs) : 
    temp = self.compare_titles (ts_numbers, **kwargs) 
    length = [ len(max(temp[0].keys(), key = len)) ] 
    def temp_fun (x, i) : 
     try : 
      return self.ts[ts_numbers[i]].titles[x[0]] 
     except IndexError : 
      return '' 
    for i in range(0, len(temp)) : 
     length.append(temp_fun(max(temp[i].values(), 
      key = lambda x : len(temp_fun(x, i))))) 
    for k in temp[0].keys() : 
     print('| {t: <{l}} |'.format(t = k, l = length[0]) 
     + ''.join([ ' {t: <{l}} |'.format(
      t = temp_fun(temp[i][k], i), 
      l = length[i+1]) 
      for i in range(0, len(temp)) ])) 

Ausgang:

 45   for i in range(0, len(temp)) : 
    46    length.append(temp_fun(max(temp[i].values(), 
---> 47     key = lambda x : len(temp_fun(x, i))))) 
    48   for k in temp[0].keys() : 
    49    print('| {t: <{l}} |'.format(t = k, l = length[0]) 

TypeError: temp_fun() takes exactly 2 arguments (1 given) 

Code 2:

def pprint_compare_titles (self, ts_numbers = [1], **kwargs) : 
    temp = self.compare_titles (ts_numbers, **kwargs) 
    length = [ len(max(temp[0].keys(), key = len)) ] 
    def temp_fun (x, i) : 
     try : 
      return self.ts[ts_numbers[i]].titles[x[0]] 
     except IndexError : 
      return '' 
    for i in range(0, len(temp)) : 
     length.append(temp_fun(max(temp[i].values(), 
      key = lambda x : len(temp_fun(x, i, 42))))) 
    for k in temp[0].keys() : 
     print('| {t: <{l}} |'.format(t = k, l = length[0]) 
     + ''.join([ ' {t: <{l}} |'.format(
      t = temp_fun(temp[i][k], i), 
      l = length[i+1]) 
      for i in range(0, len(temp)) ])) 

Ausgang:

 45   for i in range(0, len(temp)) : 
    46    length.append(temp_fun(max(temp[i].values(), 
---> 47     key = lambda x : len(temp_fun(x, i, 42))))) 
    48   for k in temp[0].keys() : 
    49    print('| {t: <{l}} |'.format(t = k, l = length[0]) 

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

Der einzige Unterschied zwischen diesen beiden Blöcken ist die Anzahl der Argumente, die ich zu temp_fun geben. Die zweite Ausgabe macht sens, aber ich kann das Verhalten der ersten nicht verstehen, da Python 3 Parameter auf der zweiten erkennt.

Wenn jemand eine Vorstellung davon hat, was vor sich geht, würde ich es gerne nehmen.

+0

Das Problem, das ich denke, ist auf Ihrer Linie 46, die auch eine 'temp_fun' Funktion hat und das scheint nur 1 Argument anstelle von 2 zu nehmen. – xbb

+0

Tatsächlich vergaß ich, dass ich diesen hinzufügen musste, und die Pfeilposition schickte mich auf dem falschen. – Thrastylon

Antwort

3

Sieht aus wie der Fehler tatsächlich auf der Linie, dass eine vorherige auftritt:

length.append(temp_fun(max(temp[i].values(), 
        #^^^^^^^^ here 
     key = lambda x : len(temp_fun(x, i))))) 

Die temp_fun in Ihrem len Anruf hat die richtige Anzahl von Argumenten, aber nicht die temp_fun in Ihrem append Anruf.

+0

Naja, dieser Pfeilzeiger hat mich blind gemacht. – Thrastylon

+0

Ja, Ungenauigkeiten in den gemeldeten Zeilennummern können die Ursache für viel Kummer beim Debuggen sein. So etwas passiert oft, besonders wenn eine Aussage über mehrere Zeilen verteilt ist. Es ist ratsam, misstrauisch zu sein, wenn Python sagt, dass das Problem in Zeile X ist. Überprüfen Sie auch Zeile X-1 und X + 1 ;-) – Kevin

+0

@ PM2Ring Diese 42 Arg war nur um meinen Standpunkt zu verdeutlichen. – Thrastylon

Verwandte Themen