2013-07-04 1 views
7

Рассмотрим следующую строку здания заявление:Python: Форматирование строки с использованием имен переменных заполнителей

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

Использование четыре %s может сбивать с толку, поэтому я предпочитаю использовать имена переменных:

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

Когда root_dir, tag и trunk определены в пределах класса, используя self.__dict__ хорошо работает:

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

Но когда переменные являются локальными, они не определены в словаре, поэтому я использую конкатенацию вместо:

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

Я считаю этот метод довольно запутанным , но я не знаю, как построить строку, используя локальные локальные переменные.

Как я могу построить строку с именами переменных, когда переменные являются локальными?

Обновление: Использование функции locals() сделало трюк.

Обратите внимание, что смешивание локальных и объектных переменных разрешено! например,

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

ответ

16

Вы можете использовать locals() функция

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

EDIT:

С питона 3.6 вы можете использовать string interpolation:

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

Спасибо, полностью забыл 'locals()'. –

+0

Обратите внимание, что '{a}'. Format (** locals()), '{a}'. Format (a = a) и '{0}'. Формат (a) синхронизирован с частотой 450 нс, 410 и 215 , (нормально, это ns ...) – comte

1

Вы пробовали s="svn cp {root_dir}/{trunk}/ {root_dir}/{tag}/".format(**locals())?

Смежные вопросы