Как мне создать многострочную строку Python со встроенными переменными?

103

Я ищу чистый способ использования переменных в многострочной строке Python. Скажем, я хотел сделать следующее:

string1 = go
string2 = now
string3 = great

"""
I will $string1 there
I will go $string2
$string3
"""

Я ищу, есть ли что-то похожее на $Perl для обозначения переменной в синтаксисе Python.

Если нет - как лучше всего создать многострочную строку с переменными?

эволюция
источник

Ответы:

159

Обычный способ - это format()функция:

>>> s = "This is an {example} with {vars}".format(vars="variables", example="example")
>>> s
'This is an example with variables'

Он отлично работает со строкой многострочного формата:

>>> s = '''\
... This is a {length} example.
... Here is a {ordinal} line.\
... '''.format(length='multi-line', ordinal='second')
>>> print(s)
This is a multi-line example.
Here is a second line.

Вы также можете передать словарь с переменными:

>>> d = { 'vars': "variables", 'example': "example" }
>>> s = "This is an {example} with {vars}"
>>> s.format(**d)
'This is an example with variables'

Наиболее близким к тому, что вы просили (с точки зрения синтаксиса), являются строки шаблона . Например:

>>> from string import Template
>>> t = Template("This is an $example with $vars")
>>> t.substitute({ 'example': "example", 'vars': "variables"})
'This is an example with variables'

Я должен добавить, что эта format()функция более распространена, потому что она легко доступна и не требует строки импорта.

Симеон Виссер
источник
2
Можно использовать vars()или в locals()качестве рассматриваемого словаря
Исмаил Бадави,
2
@isbadawi Явное лучше, чем неявное. Лучше передавать только те переменные, которые вам нужны. Если вы не знаете, что вам нужно, поскольку строка предоставляется пользователем, «переменные» в dictлюбом случае должны быть элементами в .
agf
Второе решение - чистейшее ИМО. Словарь вместе с понятным именем переменной из словаря в многострочном элементе. Я буду использовать этот метод. Спасибо. Множество отличных ответов ниже, но это было прекрасно.
evolution
@SimeonVisser, "string" .format (...) недействителен в устаревших версиях Python (например, 2.4)
Oz123,
При использовании фигурных скобок их нужно экранировать как {{this}}.
Джонни
54

ПРИМЕЧАНИЕ . Рекомендуемый способ форматирования строк в Python - использовать format(), как указано в принятом ответе . Я сохраняю этот ответ как пример синтаксиса C-стиля, который также поддерживается.

# NOTE: format() is a better choice!
string1 = "go"
string2 = "now"
string3 = "great"

s = """
I will %s there
I will go %s
%s
""" % (string1, string2, string3)

print(s)

Некоторое чтение:

Дэвид Кейн
источник
2
На самом деле это не то же самое, потому что OP хочет именованные параметры, а не позиционные.
Исмаил Бадави,
2
Это по-прежнему хорошее решение, а для многострочной интерполяции оно более прямое. Вам не нужно ничего импортировать, и он использует обычную интерполяцию Python.
откроется
4
« Вы, наверное, могли бы ответить на этот вопрос, немного погуглив » Подразумевая, что мы не нашли этот пост после того, как погуглили ...
Stevoisiak
32

Вы можете использовать f-строки Python 3.6 для переменных внутри многострочных или длинных однострочных строк. Вы можете вручную указать символы новой строки, используя \n.

Переменные в многострочной строке

string1 = "go"
string2 = "now"
string3 = "great"

multiline_string = (f"I will {string1} there\n"
                    f"I will go {string2}.\n"
                    f"{string3}.")

print(multiline_string)

Я пойду туда
я пойду сейчас
отлично

Переменные в длинной однострочной строке

string1 = "go"
string2 = "now"
string3 = "great"

singleline_string = (f"I will {string1} there. "
                     f"I will go {string2}. "
                     f"{string3}.")

print(singleline_string)

Я пойду туда. Я пойду сейчас. большой.


В качестве альтернативы вы также можете создать многострочную f-строку с тройными кавычками.

multiline_string = f"""I will {string1} there.
I will go {string2}.
{string3}."""
Stevoisiak
источник
Это сохраняет ваш исходный код красивым, и в версиях до Python3.6 вы можете получить тот же эффект, просто сделав это (дополнительный набор скобок и использование +для объединения): stackoverflow.com/a/54564926/4561887
Gabriel Staples,
Тройное цитирование чрезвычайно предпочтительно. Сначала вы должны представить эту форму.
jpmc26
@ jpmc26 Сначала я представил стиль скобок, основанный на рекомендациях PEP 8 по отступам кода . Почему предпочтительнее тройное цитирование?
Stevoisiak
10

Вот чего вы хотите:

>>> string1 = "go"
>>> string2 = "now"
>>> string3 = "great"
>>> mystring = """
... I will {string1} there
... I will go {string2}
... {string3}
... """
>>> locals()
{'__builtins__': <module '__builtin__' (built-in)>, 'string3': 'great', '__package__': None, 'mystring': "\nI will {string1} there\nI will go {string2}\n{string3}\n", '__name__': '__main__', 'string2': 'now', '__doc__': None, 'string1': 'go'}
>>> print(mystring.format(**locals()))

I will go there
I will go now
great
Havok
источник
Обратите внимание, что тройные кавычки """сохраняют символы новой строки, а это означает, что перед и после mystring
нее
Вы можете использовать .strip(), .rstrip()или .lstrip(), или ue люфт внутри тройных кавычек, чтобы избежать создания новой строки. mystring = "" "\ ABC \" ""
Havok
6

Можно передать словарь format(), каждое имя ключа станет переменной для каждого связанного значения.

dict = {'string1': 'go',
        'string2': 'now',
        'string3': 'great'}

multiline_string = '''I'm will {string1} there
I will go {string2}
{string3}'''.format(**dict)

print(multiline_string)


Также можно передать список, format()в этом случае порядковый номер каждого значения будет использоваться в качестве переменных.

list = ['go',
        'now',
        'great']

multiline_string = '''I'm will {0} there
I will go {1}
{2}'''.format(*list)

print(multiline_string)


Оба приведенных выше решения будут выводить одно и то же:

Я пойду туда
я пойду сейчас
отлично

шутка
источник
1

Если кто-то пришел сюда из клиента python-graphql в поисках решения для передачи объекта в качестве переменной, вот что я использовал:

query = """
{{
  pairs(block: {block} first: 200, orderBy: trackedReserveETH, orderDirection: desc) {{
    id
    txCount
    reserveUSD
    trackedReserveETH
    volumeUSD
  }}
}}
""".format(block=''.join(['{number: ', str(block), '}']))

 query = gql(query)

Не забудьте экранировать фигурные скобки, как я: "{{", "}}"

Раду Чобану
источник
1

f-строки , также называемые «форматированными строковыми литералами», представляют собой строковые литералы, которые имеютf в начале; и фигурные скобки, содержащие выражения, которые будут заменены их значениями.

f-строки оцениваются во время выполнения.

Итак, ваш код можно переписать как:

string1="go"
string2="now"
string3="great"
print(f"""
I will {string1} there
I will go {string2}
{string3}
""")

И это будет оценивать:

I will go there
I will go now
great

Вы можете узнать об этом подробнее здесь .

Аншика Сингх
источник