Як створити багаторядковий рядок Python із вбудованими змінними?


102

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

string1 = go
string2 = now
string3 = great

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

Я шукаю, чи є щось подібне до $Perl для позначення змінної в синтаксисі Python.

Якщо ні - який найчистіший спосіб створити багаторядковий рядок зі змінними?

Відповіді:


158

Загальним способом є 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,

Друге рішення - це найчистіший ІМО. Словник, а також чітке ім’я змінної зі словника в багаторядковому стилі. Я буду використовувати цей метод. Дякую. Також є багато чудових відповідей, але це було ідеально.
еволюція

@SimeonVisser, "string" .format (...) недійсний у застарілих версіях python (наприклад, 2.4)
Oz123

Якщо ви використовуєте фігурні дужки, їх потрібно уникати, як {{this}}.
Джонні,

53

ПРИМІТКА . Рекомендованим способом форматування рядків у Python є використання format(), як зазначено у прийнятій відповіді . Я зберігаю цю відповідь як приклад синтаксису стилю С, який також підтримується.

# 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
Це насправді не однаково, оскільки ОП хоче іменовані параметри, а не позиційні.
Ісмаїл Бадаві,

2
Це все ще хороше рішення, а для багаторядкової інтерполяції воно є більш прямим. Вам не потрібно нічого імпортувати, і в ньому використовується звичайна інтерполяція python.
розквітає

4
" Ви, мабуть, могли б відповісти на це трохи погугливши ", маючи на увазі, що ми не знайшли цю публікацію після
гуглювання

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}."""

Це робить ваш вихідний код гарним, і в пре-Python3.6 ви можете отримати той самий ефект, просто виконавши це (додатковий набір дужок і використовуючи +для об’єднання): stackoverflow.com/a/54564926/4561887
Габріель Стейплз

Потрійне цитування значно краще. Ви повинні представити цю форму спочатку.
jpmc26,

@ jpmc26 Я вперше представив стиль дужок на основі рекомендацій PEP 8 щодо відступу коду . Чому перевагу має потрійне цитування?
Стевойсяк

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

Зверніть увагу, що в потрійних лапках """зберігаються нові рядки, а це означає, що є додатковий новий рядок до і післяmystring
Stevoisiak

Ви можете використовувати .strip(), .rstrip()або .lstrip(), або ue люфт всередині потрійних лапок, щоб уникнути створення нового рядка. mystring = "" "\ ABC \" ""
Хавок,

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)


Обидва рішення вище будуть видавати однакові:

Я поїду туди
я поїду зараз
чудово


0

Якщо хтось прийшов сюди з клієнта 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)

Обов’язково уникніть усіх фігурних дужок, як я: "{{", "}}"


0

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

Ви можете дізнатись більше про це тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.