2016-04-17 12 views
0

Ich versuche zu entscheiden, wie ich mit Tupel innerhalb von Methodenaufrufen aus einer Lesbarkeitsperspektive umgehen sollte.Inline-Tupel-Erstellung - was ist besser lesbar?

Der Standardweg es leicht zu übersehen die Klammern des Tupels zu machen scheint, vor allem, wenn es in mehreren verschachtelten Anrufe ist:

Foo(a, b).bar((c, len(d))) 

Bisher habe ich mit zwei verschiedenen Wegen kommen, dass ich Machen Sie es offensichtlich, dass ein Tupel erstellt wird. Ich konnte die tuple() Funktion explizit aufrufen, wie zB:

Foo(a, b).bar(tuple(c, len(d))) 

Oder ich die Linie ein wenig erweitern könnten die Tupel Klammern deutlicher zu machen:

Foo(a, b).bar(
    (c, len(d)) 
) 

Welche von diesen bevorzugt werden sollten, oder in Betracht gezogen mehr "Python"? Oder gibt es einen besseren Weg, dies zu erreichen?

+0

Ich glaube nicht, es ist sehr üblich für eine Funktion, ein einzelnes Tupel-Argument an erster Stelle zu nehmen. ('str.startswith' ist die einzige, die ich mir vorstellen kann) – chepner

+0

In C-Code sehen Sie das Hinzufügen eines Leerzeichens vor und nach dem, was in Klammern steht – qwr

+0

Diese Frage ist ausschließlich meinungsbasiert und als solche off-topic für Stack Overflow. Abgesehen davon, dass Sie etwas in ein Tupel konvertieren, ist die Verwendung der Funktion 'tuple()' * sehr * ungewöhnlich. Und es scheint nicht richtig zu sein, Zeilenumbrüche für diesen kurzen verketteten Funktionsaufruf zu haben, Sie würden das nur tun, wenn Sie ein Zeilenlängenlimit überschreiten. Eine Alternative wäre, das Tupel zuerst in einer separaten Variablen zu speichern und dann die Variable einfach zu übergeben, sodass Sie diese verschachtelten Klammern nicht haben. Und die beste Option wäre wahrscheinlich, 'bar' zu ändern, so dass es zwei Argumente anstelle eines Tupels akzeptiert. – poke

Antwort

1

Statt dessen:

Foo(a, b).bar((c, len(d))) 

es einfach erweitern:

foo = Foo(a, b) 
barparam = (c, len(d)) 
foo.bar(barparam) 

Leicht zu lesen, einfach zu ändern, einfach zu Code-Review nach der Änderung.

0

Ich denke, ich würde lieber bar als akzeptieren zwei Parameter wie Foo(a, b).bar(c, len(d)). Wenn Sie Tupel in diesem Fall verwenden möchten, kann es sein

barparam = (c, len(d)) 
foo = Foo(a,b) 
foo.bar(*barparam)