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

Дано:

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

Каков наилучший / самый короткий способ интерполировать строку для генерации следующего:

путь: / var / blah 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)

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

Ответы на вопрос(8)

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

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

s = "path: %(path)s curr: %(curr)s prev: %(prev)s" % data
 neowulf3305 окт. 2017 г., 21:33
Это гораздо более читабельно и явно.

Может быть:

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'

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

 Mark23 окт. 2015 г., 17:23
Если строка шаблона является пользовательским вводом, вы не хотите, чтобы они могли видеть локальные переменные, если есть пароли или что-то еще. Также «явный лучше, чем неявный» в соответствии с pep20 (не следуйте за pep вслепую, но, возможно, в этом случае это работает).
 bradreaves11 июл. 2013 г., 16:56
@dzen Зачем избегать местных жителей ()? Я пытался найти этот совет в другом месте, и я не нахожу много.
 hughdbrown12 июл. 2013 г., 17:12
С помощьюlocals() означает, что не ясно, какие переменные вы на самом деле. Если вы хотите использовать pylint для своего кода, pylint вполне может сообщить, что некоторые переменные не использовались, даже если вы неявно ссылались на них с помощьюlocals(), Pylint должен был бы проверить все операторы строкового формата для такого неявного использования. Так что это ярлык, последствия которого вы должны понять перед использованием.
 dzen25 нояб. 2012 г., 15:42
Избегайте использования locals () и globals () :(

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

"{0}: {path}, {1}: {curr}, {2}: {prev}".format(*data, **data)
 Bhargav08 авг. 2017 г., 20:23
Это самый лучший.

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

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

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

d = {"path": path, "curr": curr, "prev": prev}
print(f'path: {d["path"]} curr: {d["curr"]} prev: {d["prev"]}')
 Guido van Steen11 июн. 2018 г., 16:04
В python3 print это функция, которая требует скобок.

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

>>> 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, и его следует предпочитать форматированию%, описанному вОперации форматирования строки в новом коде.

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

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

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

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

Решение Вопроса

Почему нет:

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

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

Обновление 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

Ваш ответ на вопрос