Пример Ruby:
name = "Spongebob Squarepants"
puts "Who lives in a Pineapple under the sea? \n#{name}."
Успешная конкатенация строк Python кажется мне многословной.
Пример Ruby:
name = "Spongebob Squarepants"
puts "Who lives in a Pineapple under the sea? \n#{name}."
Успешная конкатенация строк Python кажется мне многословной.
Ответы:
В Python 3.6 будет добавлена интерполяция буквенных строк, аналогичная интерполяции строк в Ruby. Начиная с этой версии Python (выпуск которой запланирован на конец 2016 года), вы сможете включать выражения в "f-strings", например:
name = "Spongebob Squarepants"
print(f"Who lives in a Pineapple under the sea? {name}.")
До 3.6 самый близкий к этому
name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? %(name)s." % locals())
%
Оператор может быть использован для интерполяции строк в Python. Первый операнд - это строка для интерполяции, второй может иметь разные типы, включая «отображение», отображение имен полей на значения, которые должны быть интерполированы. Здесь я использовал словарь локальных переменных locals()
для сопоставления имени поляname
с его значением в качестве локальной переменной.
Тот же код, использующий .format()
метод последних версий Python, будет выглядеть так:
name = "Spongebob Squarepants"
print("Who lives in a Pineapple under the sea? {name!s}.".format(**locals()))
Также есть string.Template
класс:
tmpl = string.Template("Who lives in a Pineapple under the sea? $name.")
print(tmpl.substitute(name="Spongebob Squarepants"))
%s
для строки и %03d
для числа, дополненного до 3 цифр начальными нулями. Это может быть просто написано print "%s has %03d" % ("Python", 2)
. Затем в этом примере в скобках %
ставится ключ сопоставления, после которого указывается значащие имена заполнителей, а не полагается на их порядок в строке. Затем вы передаете словарь, который сопоставляет имена ключей с их значениями. Вот почему Свен использует locals()
функцию, которая возвращает dict, содержащий все ваши локальные переменные, поэтому он сопоставляется name
со значением name
s
в качестве типа преобразования - Python может преобразовать практически что угодно в строку. Но, конечно, вы потеряете специальные возможности форматирования других типов преобразования.
Начиная с Python 2.6.X вы можете использовать:
"my {0} string: {1}".format("cool", "Hello there!")
%
оператор для интерполяции строк не рекомендуется в Python 3.x. docs.python.org/dev/py3k/whatsnew/… объявляет о планах отказаться от %
начиная с версии 3.1, но этого не произошло.
{}
может меня исключить.
Я разработал пакет interpy , который позволяет интерполировать строки в Python .
Просто установите его через pip install interpy
. А затем добавьте строку# coding: interpy
в начале ваших файлов!
Пример:
#!/usr/bin/env python
# coding: interpy
name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n#{name}."
Строковая интерполяция Python похожа на printf () в C
Если вы попытаетесь:
name = "SpongeBob Squarepants"
print "Who lives in a Pineapple under the sea? %s" % name
Тег %s
будет заменен на name
переменную. Вы должны взглянуть на теги функции печати: http://docs.python.org/library/functions.html
print "First is %s, second is %s" % (var1, var2)
.
Строковая интерполяция будет включена в Python 3.6, как указано в PEP 498 . Вы сможете сделать это:
name = 'Spongebob Squarepants'
print(f'Who lives in a Pineapple under the sea? \n{name}')
Обратите внимание, что я ненавижу Спанч Боба, поэтому писать это было немного больно. :)
Вы также можете иметь это
name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n{name}.".format(name=name)
#
для печати. Они просто используют синтаксис Ruby.
#
персонаж будет напечатан.
import inspect
def s(template, **kwargs):
"Usage: s(string, **locals())"
if not kwargs:
frame = inspect.currentframe()
try:
kwargs = frame.f_back.f_locals
finally:
del frame
if not kwargs:
kwargs = globals()
return template.format(**kwargs)
Использование:
a = 123
s('{a}', locals()) # print '123'
s('{a}') # it is equal to the above statement: print '123'
s('{b}') # raise an KeyError: b variable not found
PS: производительность может быть проблемой. Это полезно для локальных сценариев, а не для рабочих журналов.
Дублированный:
Для старого Python (проверено на 2.4) верхнее решение указывает путь. Ты можешь сделать это:
import string
def try_interp():
d = 1
f = 1.1
s = "s"
print string.Template("d: $d f: $f s: $s").substitute(**locals())
try_interp()
И вы получаете
d: 1 f: 1.1 s: s
Python 3.6 и новее имеют интерполяцию буквенных строк с использованием f-строк:
name='world'
print(f"Hello {name}!")
name
в строке лежит локальная переменная, а в Python вы должны явно передавать словарь локальных переменных в формататор строк, если вы хотите, чтобы они их использовали.