2013-07-04 12 views
7

Rozważmy następujące oświadczenie budowę ciąg:Python: Formatowanie ciąg przy użyciu nazw zmiennych zastępczych

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

pomocą czterech %s może być mylące, więc wolą używać nazw zmiennych:

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

Gdy root_dir, tag i są zdefiniowane w ramach klasy, przy użyciu self.__dict__ działa dobrze:

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

Ale gdy zmienne są lokalne, nie są one zdefiniowane w słowniku, więc używam ciąg konkatenacji Zamiast:

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

Uważam to metoda dość kłopotliwe , ale nie wiem, w jaki sposób skonstruować ciąg znaków za pomocą zmiennych lokalnych w linii.

Jak skonstruować ciąg znaków przy użyciu nazw zmiennych, gdy zmienne są lokalne?

Aktualizacja: Użycie funkcji locals() rozwiązało problem.

Pamiętaj, że mieszanie zmiennych lokalnych i obiektowych jest dozwolone! np

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

Odpowiedz

16

Można użyć locals() funkcja

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

EDIT:

Od Pythona 3.6 można użyć string interpolation:

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

Dzięki, zupełnie zapomniałem 'locals()'. –

+0

Zwróć uwagę, że format "{a}" (** locals()), "{a}" format (a = a) i "{0}" format (a) są ustawione na 450ns, 410 i 215 odpowiednio . (ok to jest ns ...) – comte

1

Czy próbowałeś s="svn cp {root_dir}/{trunk}/ {root_dir}/{tag}/".format(**locals())?

Powiązane problemy