В вашем случае вы можете использовать {person}
в строке:
# double brace the person_name to escape it for the first format
s = '{hello} {{person_name}}'
a = s.format(hello='hello')
# a = 'hello {person_name}'
if something:
b = a.format(person_name='Alice')
# b = 'hello Alice'
else:
b = a.format(person_name='Bob')
# b = 'hello Bob'
print(b)
Однако при использовании этого метода вам необходимо следовать явному порядку, в котором вы экранировали свои переменные. то есть вы должны назначить hello
сначала , а затем person_name
. Если вам нужно проявлять гибкость в отношении порядка вещей, я бы предложил использовать dict
для построения переменных перед их полной передачей:
# dict approach
s = '{hello} {person_name}'
# determine the first variable
d = {'hello':'hello'}
... do something
d.update({'person': 'Alice'})
# unpack the dictionary as kwargs into your format method
b = s.format(**d)
# b = 'hello Alice'
Это дает вам немного больше гибкости в порядке вещей. Но вы должны вызывать .format()
только один раз все переменные, указанные в вашем dict
(по крайней мере, он должен иметь значение по умолчанию), в противном случае это все равно вызовет ошибку.
Если вы хотите проявить больше фантазии и хотите иметь возможность печатать имена полей при отсутствии переменной, вы также можете создать свою собственную функцию-обертку:
# wrapper approach
# We'll make use of regex to keep things simple and versatile
import re
def my_format(message, **kwargs):
# build a regex pattern to catch words+digits within the braces {}
pat = re.compile('{[\w\d]+}')
# build a dictionary based on the identified variables within the message provided
msg_args = {v.strip('{}'): v for v in pat.findall(message)}
# update the dictionary with provided keyword args
msg_args.update(kwargs)
# ... and of course, print it
print(message.format(**msg_args))
s = 'Why {hello} there {person}'
my_format(s, hello='hey')
# Why hey there {person}
my_format(s, person='Alice')
# Why {hello} there Alice
Вы можете определить отображение по умолчанию (при отсутствии переменной), которое хотите, изменив v
в словаре.