2013-07-04 12 views
7

consideri la seguente dichiarazione edificio stringa:Python: La formattazione di una stringa utilizzando nomi di variabili segnaposto

s="svn cp %s/%s/ %s/%s/" % (root_dir, trunk, root_dir, tag) 

utilizzando quattro %s può essere fonte di confusione, quindi io preferisco usare i nomi delle variabili:

s="svn cp {root_dir}/{trunk}/ {root_dir}/{tag}/".format(**SOME_DICTIONARY) 

Quando root_dir, tag e trunk sono definiti nell'ambito di una classe, utilizzando self.__dict__ funziona bene:

s="svn cp {root_dir}/{trunk}/ {root_dir}/{tag}/".format(**self.__dict__) 

Ma quando le variabili sono locali, non vengono definiti in un dizionario, per cui uso concatenazione di stringhe, invece:

s="svn cp "+root_dir+"/"+trunk+"/ "+root_dir+"/"+tag+"/" 

trovo questo metodo piuttosto confusa , ma non conosco alcun modo per costruire una stringa usando le variabili locali in-line.

Come posso costruire la stringa utilizzando nomi di variabili quando le variabili sono locali?

Aggiornamento: l'uso della funzione locals() ha funzionato.

Si noti che è consentita la combinazione di variabili locali e oggetto! per esempio,

s="svn cp {self.root_dir}/{trunk}/ {self.root_dir}/{tag}/".format(**locals()) 

risposta

16

È possibile utilizzare la funzione locals()

s="svn cp {root_dir}/{trunk}/{root_dir}/{tag}/".format(**locals()) 

EDIT:

Dal python 3.6 è possibile utilizzare string interpolation:

s = f"svn cp {root_dir}/{trunk}/{root_dir}/{tag}/" 
+1

Grazie, completamente dimenticato 'locals()'. –

+0

nota che '{a}'. Format (** locals()), '{a}'. Format (a = a) e '{0}'. Format (a) sono cronometrati a 450ns, 410 e 215 rispettosi . (ok è ns ...) – comte

1

Hai provato s="svn cp {root_dir}/{trunk}/ {root_dir}/{tag}/".format(**locals())?