2015-08-07 7 views
5

In JavaScript ich so etwas tun können:Python: split Call-Methode in mehrere Zeilen

var template = "{a}{b}-{c}{d}"; 
var myStuff = template 
       .replace("{a}", a) 
       .replace("{b}", b) 
       .replace("{c}", c) 
       .replace("{d}", d); 

Ich mag wäre etwas Ähnliches in Python tun, aber aufgrund der Tatsache, dass Python Einzug für Codeblöcke verwendet, ich kann nicht einfach schreiben:

myStuff = template 
       .replace("{a}", a) 
       .replace("{b}", b) 
       .replace("{c}", c) 
       .replace("{d}", d) 

ich möchte nicht über diese schreiben haben:

myStuff = template.replace("{a}", a).replace("{b}", b).replace("{c}", c).replace("{d}", d) 

Or dies:

myStuff = template 
myStuff = myStuff.replace("{a}", a) 
myStuff = myStuff.replace("{b}", b) 
myStuff = myStuff.replace("{c}", c) 
myStuff = myStuff.replace("{d}", d) 

Sie sehen beide hässlich aus (und ich mag meinen Code nicht hässlich!).
Gibt es eine Möglichkeit, eine Methode Aufrufkette in neue Zeilen in Python zu brechen, genau wie ich in JavaScript?

+4

gibt es .format für diesen :) 'mystuff = template.format (x = x, a = a, b = b) ' –

Antwort

3

Andere Antworten bekommen würden, wie Sie eine Anweisung in mehrere Zeilen aufgeteilt, aber ein einfacher Weg zu erreichen, was Sie str.format() zu verwenden wären tun -

>>> template = "{a}{b}-{c}{d}" 
>>> a = 1 
>>> b = 2 
>>> c = 3 
>>> d = 4 
>>> template.format(**{'a':a,'b':b,'c':c,'d':d}) 
'12-34' 
>>> template.format(a=a,b=b,c=c,d=d) 
'12-34' 

Die erste str.format() auspackt ein Wörterbuch in Keyword-Argumente für die Funktion format() (ähnlich wie die zweite direkt).


Sie können aber auch die Argumente für einen Funktionsaufruf in mehr aufgeteilt ohne \, Beispiel zu verwenden -

>>> template.format(a=a, 
...     b=b, 
...     c=c, 
...     d=d) 
'12-34' 
+0

Danke für deine Antwort! Format sieht gut aus, aber meine Variablennamen sind ziemlich lang (a, b, c, d waren nur Beispiele), so würde ich sowieso mit einer wirklich langen Codezeile enden:/ –

+1

@DanielGruszczyk wollten Sie ein realistischeres Beispiel liefern für deinen Anwendungsfall dann? –

+0

Ich denke, ich kann, genau wie in der anderen Antwort gezeigt :) –

4

können Sie \ verwenden, um eine Linie zu brechen:, ersetzt sie alle mit einer for-Schleife und gibt den neuen String

s = s.replace('a', 'x')\ 
     .replace('b', 'y')\ 
     .replace('c', 'z') 

Oder Sie können eine generische Funktion erstellen, die ein Wörterbuch der alten und neuen Werte akzeptiert.

+1

Ehrfürchtig, das ist genau das, was ich gesucht habe, danke :) –

+0

Ich denke, das sollte die akzeptierte Antwort sein.! – Vasif

7

Im Allgemeinen ist Ihre einzige Hoffnung, Linienverbindung zu verwenden. Sie können immer explizit Linie

myStuff = template \ 
      .replace("{a}", a) \ 
      .replace("{b}", b) \ 
      .replace("{c}", c) \ 
      .replace("{d}", d) 

implizite Linie verwenden Beitritt Beitritt verwenden Sie irgendwo kommen müssen Klammer (implizite Linie zu setzen Beitritt wird, wenn Sie etwas in paretheses, Klammern oder Klammern - wenn über mehrere Zeilen aufgeteilt die Identifikation wird nicht wirksam). Zum Beispiel

myStuff = (template.replace("{a}", a) 
      .replace("{b}", b) 
      .replace("{c}", c) 
      .replace("{d}", d)) 

Dann können Sie natürlich wahrscheinlich spezielle Lösungen für spezielle Situationen, wie Zeichenfolge mit der Formatierung in Ihrem Beispiel:

myStuff = template.format(a=a, b=b, c=c, d=d) 

aber das wird nicht funktionieren, wenn Sie versuchen, etwas zu ersetzen, ganz anders (es scheitert auch nicht, wenn a, b, c oder d zufällig etwas anderes als ein String ist).

+0

Danke für 2 schöne Beispiele :) –