2015-08-07 7 views
5

in JavaScript che posso fare qualcosa di simile:Python: chiamata di metodo diviso in più righe

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

mi piacerebbe fare qualcosa di simile in Python, ma a causa del fatto che Python usa l'indentazione per i blocchi di codice, non posso scrivere semplicemente:

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

non voglio avere a scrivere questo:

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

Or this:

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

Entrambi sembrano brutti (e non mi piace il mio codice brutto!).
C'è un modo per rompere un metodo call chain in nuove linee in python, proprio come ho fatto in JavaScript?

+4

c'è .format per quello :) 'mystuff = template.format (x = x, a = a, b = b) ' –

risposta

3

altre risposte otterrebbe come dividere una dichiarazione in più righe, ma un modo più semplice per ottenere ciò che si sta facendo sarebbe quella di utilizzare str.format() -

>>> 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' 

Il primo str.format() scompatta un dizionario in argomenti a parola chiave per la funzione format() (simile a quello che fa la seconda direttamente).


Inoltre, è possibile dividere gli argomenti di una chiamata di funzione in più righe, senza dover utilizzare \, Esempio -

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

Grazie per la risposta! Il formato sembra bello, ma i miei nomi delle variabili sono piuttosto lunghi (a, b, c, d erano solo degli esempi) quindi avrei finito con una riga di codice molto lunga comunque:/ –

+1

@DanielGruszczyk volevi fornire un esempio più realistico per il tuo caso d'uso allora? –

+0

Immagino di sì, proprio come mostrato nell'altra risposta :) –

4

È possibile utilizzare \ per interrompere una riga:

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

In alternativa è possibile creare una funzione generica che accetta un dizionario di valori vecchi e nuovi, li sostituisce con un ciclo e restituisce la nuova stringa.

+1

Impressionante, questo è esattamente quello che stavo cercando, grazie :) –

+0

Credo che questa dovrebbe essere la risposta accettata.! – Vasif

7

In generale, l'unica speranza è quella di utilizzare la linea. È sempre possibile utilizzare la linea esplicito unisce

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

Per utilizzare unione implicita di linee che devi venire con un posto dove mettere tra parentesi (unione implicita di linee viene quando hai qualcosa dentro paretheses, quadre o graffe - se dividere su più righe l'identificazione non ha effetto). Per esempio

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

Poi, naturalmente, si può probabilmente trovare soluzioni speciali per situazioni specifiche, come l'utilizzo di formattazione delle stringhe nel tuo esempio:

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

ma che non funziona se si sta cercando di sostituire qualcosa interamente altro (non fallisce anche se a, b, c o d si verifica che sia qualcosa di diverso da una stringa).

+0

Grazie per 2 bei esempi :) –

Problemi correlati