Замените одно и то же значение кратным при форматировании строки?

#python

Вопрос:

Мне нужно просто заменить имя шрифта как RSQFont, если значение 123, или Обычное, если не значение .. Итак, у меня есть этот код …

 if 123.value:
    FontName='RSQFont'
else:
    FontName='Regular'

"""<screen backgroundColor="#16000000" name="AGC_Picon" position="210,130" size="800,470" title="Quick Signal Info" zPosition="1" flags="wfNoBorder">
    <widget source="Title" render="Label" font="%(key)s;23" foregroundColor="#00bbbbbb" position="0,0" size="350,30" transparent="1" />
    <widget source="global.CurrentTime" render="Label" position="545,0" size="250,30" font="%(key)s;23" valign="top" halign="left" foregroundColor="#00bbbbbb" transparent="1">
        <convert type="ClockToText">Format:%d-%m-%Y   %H:%M:%S</convert>
    </widget>
    <widget source="session.CurrentService" render="Label" position="599,403" size="200,25" font="%(key)s; 20" halign="center" backgroundColor="#54111112" foregroundColor="#fec000" transparent="1">
        <convert type="RaedQuickServName2">%F %p %Y %M %s</convert>
    </widget>
    <widget source="session.CurrentService" render="Label" position="599,435" size="200,23" font="%(key)s; 18" halign="center" backgroundColor="#54111112" foregroundColor="#00bbbbbb" transparent="1">
        <convert type="RaedQuickServName2">%c %l %h %m %g %b %e %S</convert>
    </widget>
    <widget name="Satfinder" position="5,319" size="300,18" zPosition="1" font="%(key)s;17" halign="left" backgroundColor="#54111112" foregroundColor="#0000deff" transparent="1" />
</screen>""" % {'key': FontName,}
 

Но у меня есть эта ошибка

  """ % {'key': FontName,}
TypeError: not enough arguments for format string
 

Я пробовал другой метод, но я не могу его решить …

Я пытался

  .format(FontName)
 

вместо

 {'key': FontName,}
 

И другие вещи, но ничего, что могло бы помочь …
и совет ?!!!

P. s: Я не могу использовать код %s, потому что в некоторых строках он уже есть, и я использую его с другими файлами python, как это

 <convert type="RaedQuickServName2">%F %p %Y %M %s</convert>
 

и

 <convert type="ClockToText">Format:%d-%m-%Y   %H:%M:%S</convert>
 

Комментарии:

1. почему бы не использовать f-строку или str.format() вместо форматирования строк в старом стиле или даже шаблонного движка , подобного jinja2 ?

2. Возможно, это проблема с публикацией, но «код» в первой части вашего вопроса недействителен и не имеет смысла. Содержит ли он где-нибудь строку в тройных кавычках?

3. Теперь в этом больше смысла. Проблема в том, что строка содержит % символы, которые % интерпретирует строковый оператор Python. Чтобы обойти это, вам нужно будет «экранировать» все остальные % символы, удвоив их (чтобы % строковый оператор мог превратить их обратно в отдельные символы). Более простым обходным решением было бы использовать более современный str.format() метод, который использует { } символы и (как уже предлагал @buran).

4. Другой альтернативой (которая также использует { } символы и) было бы использование f-строк , которые были добавлены в Python 3.6.

5. Если бы вы использовали font="{0};23" его, вам пришлось бы пройти только FontName один раз.

Ответ №1:

Как уже упоминалось в комментариях — используйте f-строку:

 font_name='RSQFont'

html = f"""<screen backgroundColor="#16000000" name="AGC_Picon" position="210,130" size="800,470" title="Quick Signal Info" zPosition="1" flags="wfNoBorder">
    <widget source="Title" render="Label" font="{font_name};23" foregroundColor="#00bbbbbb" position="0,0" size="350,30" transparent="1" />
    <widget source="global.CurrentTime" render="Label" position="545,0" size="250,30" font="{font_name};23" valign="top" halign="left" foregroundColor="#00bbbbbb" transparent="1">
        <convert type="ClockToText">Format:%d-%m-%Y   %H:%M:%S</convert>
    </widget>
    <widget source="session.CurrentService" render="Label" position="599,403" size="200,25" font="{font_name}; 20" halign="center" backgroundColor="#54111112" foregroundColor="#fec000" transparent="1">
        <convert type="RaedQuickServName2">%F %p %Y %M %s</convert>
    </widget>
    <widget source="session.CurrentService" render="Label" position="599,435" size="200,23" font="{font_name}; 18" halign="center" backgroundColor="#54111112" foregroundColor="#00bbbbbb" transparent="1">
        <convert type="RaedQuickServName2">%c %l %h %m %g %b %e %S</convert>
    </widget>
    <widget name="Satfinder" position="5,319" size="300,18" zPosition="1" font="{font_name};17" halign="left" backgroundColor="#54111112" foregroundColor="#0000deff" transparent="1" />
</screen>"""

print(html)
 

или str.format() способ:

 font_name='RSQFont'

html = """<screen backgroundColor="#16000000" name="AGC_Picon" position="210,130" size="800,470" title="Quick Signal Info" zPosition="1" flags="wfNoBorder">
    <widget source="Title" render="Label" font="{font};23" foregroundColor="#00bbbbbb" position="0,0" size="350,30" transparent="1" />
    <widget source="global.CurrentTime" render="Label" position="545,0" size="250,30" font="{font};23" valign="top" halign="left" foregroundColor="#00bbbbbb" transparent="1">
        <convert type="ClockToText">Format:%d-%m-%Y   %H:%M:%S</convert>
    </widget>
    <widget source="session.CurrentService" render="Label" position="599,403" size="200,25" font="{font}; 20" halign="center" backgroundColor="#54111112" foregroundColor="#fec000" transparent="1">
        <convert type="RaedQuickServName2">%F %p %Y %M %s</convert>
    </widget>
    <widget source="session.CurrentService" render="Label" position="599,435" size="200,23" font="{font}; 18" halign="center" backgroundColor="#54111112" foregroundColor="#00bbbbbb" transparent="1">
        <convert type="RaedQuickServName2">%c %l %h %m %g %b %e %S</convert>
    </widget>
    <widget name="Satfinder" position="5,319" size="300,18" zPosition="1" font="{font};17" halign="left" backgroundColor="#54111112" foregroundColor="#0000deff" transparent="1" />
</screen>""".format(font=font_name) # or .format(**{'font':font_name})
print(html)
 

Вы также можете выбрать более сложное решение , используя шаблонный движок, например jinja2 , который является де-факто стандартным подходом в веб-разработке