Есть ли Python, эквивалентный строковой интерполяции Ruby? - PullRequest
312 голосов
/ 15 декабря 2010

Пример Ruby:

name = "Spongebob Squarepants"
puts "Who lives in a Pineapple under the sea? \n#{name}."

Мне кажется, что успешная конкатенация строк Python многословна.

Ответы [ 9 ]

379 голосов
/ 15 декабря 2010

Python 3.6 добавит буквенную интерполяцию строк аналогично интерполяции строк в Ruby.Начиная с этой версии Python (выпуск которой запланирован на конец 2016 года), вы сможете включать выражения в «f-строки», например,

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"))
135 голосов
/ 15 декабря 2010

Начиная с Python 2.6.X вы можете использовать:

"my {0} string: {1}".format("cool", "Hello there!")
32 голосов
/ 08 января 2014

Я разработал пакет 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}."
26 голосов
/ 21 октября 2015

Строковая интерполяция будет включена в Python 3.6, как указано в PEP 498 . Вы сможете сделать это:

name = 'Spongebob Squarepants'
print(f'Who lives in a Pineapple under the sea? \n{name}')

Обратите внимание, что я ненавижу Спанч Боба, поэтому писать это было немного больно. :)

25 голосов
/ 15 декабря 2010

Интерполяция строк в 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

4 голосов
/ 12 декабря 2013

Вы также можете иметь это

name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n{name}.".format(name=name)

http://docs.python.org/2/library/string.html#formatstrings

3 голосов
/ 01 июля 2013
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: производительность может быть проблемой. Это полезно для локальных сценариев, а не для рабочих журналов.

Дублированный:

2 голосов
/ 04 октября 2016

Для старого 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
0 голосов
/ 28 мая 2019

Python 3.6 и новее имеют интерполяцию буквенных строк с использованием f-строк:

name='world'
print(f"Hello {name}!")
...