2009-08-20 4 views
19

Даны:Python строка интерполяция с использованием словаря и строк

dict = {"path": "/var/blah"} 
curr = "1.1" 
prev = "1.0" 

Что лучший/кратчайший путь к интерполировать строку для создания следующим:

пути:/вар/л CURR: 1.1 предыдущих : 1,0

Я знаю, что это работает:

str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % {"path": dict["path"],"curr": curr, "prev": prev} 

Но я надеялся, что есть более короткий путь, например:

str = "path: %(path)s curr: %s prev: %s" % (dict, curr, prev) 

Мои извинения, если это кажется излишне педантичным вопрос.

ответ

13

Почему нет:

mystr = "path: %s curr: %s prev: %s" % (mydict[path], curr, prev) 

BTW, я изменил пару имен вы с помощью этого попрать встроенные имена - не делает этого, он никогда не нуждалось, и один раз в каком-то время будет тратить много вашего времени отслеживая неправильное поведение, которое оно вызывает (где-то использует встроенное имя, предполагая, что это означает встроенный, но вы скрыли его с именем нашей собственной переменной).

12

Может быть:

path = dict['path'] 
str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % locals() 

Я имею в виду это работает:

>>> dict = {"path": "/var/blah"} 
>>> curr = "1.1" 
>>> prev = "1.0" 
>>> path = dict['path'] 
>>> str = "path: %(path)s curr: %(curr)s prev: %(prev)s" % locals() 
>>> str 
'path: /var/blah curr: 1.1 prev: 1.0' 

Я просто не знаю, если вы считаете, что короче.

+2

Избегайте использует местных жителей() и глобалов() :( – dzen

+0

@dzen Почему избежать местных жителей()? Я попытался найти этот совет в другом месте, и я не находящих много. – bradreaves

+2

Использование ' locals() 'означает, что неясно, какие переменные вы на самом деле. Если вы хотите нарисовать свой код, pylint вполне может сообщить, что некоторые переменные не использовались, хотя вы ссылались на них неявно на' locals() '. Pylint бы для проверки всех операторов строкового формата для такого неявного использования. Таким образом, это ярлык, последствия которого вы должны понять перед использованием. – hughdbrown

45

Вы можете попробовать это:

data = {"path": "/var/blah", 
     "curr": "1.1", 
     "prev": "1.0"} 

s = "path: %(path)s curr: %(curr)s prev: %(prev)s" % data 
+1

Это более читаемо и понятно. – neowulf33

21

И, конечно, вы могли бы использовать более новую (от 2.6) .format метод строки:

>>> mydict = {"path": "/var/blah"} 
>>> curr = "1.1" 
>>> prev = "1.0" 
>>> 
>>> s = "path: {0} curr: {1} prev: {2}".format(mydict['path'], curr, prev) 
>>> s 
'path: /var/blah curr: 1.1 prev: 1.0' 

Или, если все элементы были в словаре, вы могли бы сделать это:

>>> mydict = {"path": "/var/blah", "curr": 1.1, "prev": 1.0} 
>>> "path: {path} curr: {curr} prev: {prev}".format(**mydict) 
'path: /var/blah curr: 1.1 prev: 1.0' 
>>> 

Из документации str.format():

Этот метод форматирования строки является новый стандарт в Python 3.0 и следует предпочесть в% форматирования, описанного в String Formatting Operations в новом коде.

+3

Используя str.format, он мог написать путь ': {mydict [path]} curr: {curr} prev: {prev}". Format (mydict = mydict, curr = curr, prev = prev) 'или даже' locals () 'для аргумента для форматирования' 'path: {mydict [path]} curr: {curr} prev: {prev}". format (** locals()) ' – johnny

2

Вы можете сделать следующее, если вы поместите ваши данные в словаре:

data = {"path": "/var/blah","curr": "1.1","prev": "1.0"} 

"{0}: {path}, {1}: {curr}, {2}: {prev}".format(*data, **data) 
+0

Это лучший. – Bhargav

3

Вы можете также (скоро) использовать f-strings в Python 3.6, который, вероятно, самый короткий путь для форматирования строки:

print f'path: {path} curr: {curr} prev: {prev}' 

И даже поместить все данные внутри Dict:

d = {"path": path, "curr": curr, "prev": prev} 
print f'path: {d["path"]} curr: {d["curr"]} prev: {d["prev"]}' 
1

Если вы не хотите, чтобы добавить неизменные переменные к вашему словарь каждый раз, вы можете ссылаться на обе переменные и ключи словаря, используя формат:

str = "path {path} curr: {curr} prev: {prev}".format(curr=curr, prev=prev, **dict)

Это может быть плохой форме логически, но я t делает вещи более модульными, ожидая, что curr и prev будут в основном статическими и словарь для обновления.

1

Update 2016: На Python 3.6 вы можете заменить переменные в строки по имени:

>>> origin = "London" 
>>> destination = "Paris" 
>>> f"from {origin} to {destination}" 
'from London to Paris' 

Обратите внимание на f" префикс. Если вы попробуете это в Python 3.5 или ранее, вы получите SyntaxError.

См https://docs.python.org/3.6/reference/lexical_analysis.html#f-strings

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

  • Нет связанных вопросов^_^