Как я могу печатать литеральные фигуры в фигурных скобках в строке python, а также использовать .format на нем?

x = " \{ Hello \} {0} "
print x.format(42)

дает мне: Key Error: Hello\\

Я хочу напечатать вывод: {Hello} 42

Ответы

Ответ 1

Вам нужно удвоить значения {{ и }}:

>>> x = " {{ Hello }} {0} "
>>> print x.format(42)
' { Hello } 42 '

Здесь соответствующая часть документации Python для синтаксиса строки формата:

Строки формата содержат "поля замены", окруженные фигурными фигурными скобками {}. Все, что не содержится в фигурных скобках, считается буквальным текстом, который не изменяется на выходе. Если вам нужно включить символ скобки в буквальном тексте, его можно избежать путем удвоения: {{ и }}.

Ответ 2

Вы избегаете его удвоением фигурных скобок.

Например:

x = "{{ Hello }} {0}"
print x.format(42)

Ответ 3

ОП написал этот комментарий:

Я пытался отформатировать небольшой JSON для некоторых целей, например: '{"all": false, "selected": "{}"}'.format(data) чтобы получить что-то вроде {"all": false, "selected": "1,2"}

Довольно часто возникает проблема с "выходящими скобками" при работе с JSON.

Я предлагаю сделать это:

import json
data = "1,2"
mydict = {"all": "false", "selected": data}
json.dumps(mydict)

Это чище, чем альтернатива, а именно:

'{{"all": false, "selected": "{}"}}'.format(data)

Использование библиотеки json определенно предпочтительнее, когда строка JSON становится более сложной, чем в примере.

Ответ 4

Python 3. 6+ (2017)

В последних версиях Python можно использовать f-строки (см. Также PEP498).

С f-строками нужно использовать double {{ или }}

n = 42  
print(f" {{Hello}} {n} ")

производит желаемое

 {Hello} 42

Если вам нужно разрешить выражение в скобках вместо использования литерального текста, вам понадобится три набора скобок:

hello = "HELLO"
print(f"{{{hello.lower()}}}")

производит

{hello}

Ответ 5

Попробуйте сделать это:

x = " {{ Hello }} {0} "
print x.format(42)

Ответ 6

Попробуйте следующее:

x = "{{ Hello }} {0}"

Ответ 7

Хотя это не лучше, просто для справки, вы также можете это сделать:

>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42

Это может быть полезно, например, когда кто-то хочет распечатать {argument}. Возможно, это более читаемо, чем '{{{}}}'.format('argument')

Обратите внимание, что вы игнорируете позиции позиций (например, {} вместо {0}) после Python 2.7

Ответ 8

Если вы собираетесь делать это много, может быть полезно определить функцию утилиты, которая позволит вам вместо этого использовать произвольные заменители скобок, например

def custom_format(string, brackets, *args, **kwargs):
    if len(brackets) != 2:
        raise ValueError('Expected two brackets. Got {}.'.format(len(brackets)))
    padded = string.replace('{', '{{').replace('}', '}}')
    substituted = padded.replace(brackets[0], '{').replace(brackets[1], '}')
    formatted = substituted.format(*args, **kwargs)
    return formatted

>>> custom_format('{{[cmd]} process 1}', brackets='[]', cmd='firefox.exe')
'{{firefox.exe} process 1}'

Обратите внимание, что это будет работать либо с скобками, являющимися строкой длины 2, либо с истребимой из двух строк (для многосимвольных разделителей).

Ответ 9

Если вам нужно сохранить две фигурные скобки в строке, вам нужно 5 фигурных скобок с каждой стороны переменной.

>>> myvar = 'test'
>>> "{{{{{0}}}}}".format(myvar)
'{{test}}'

Ответ 10

Причина в том, что {} - это синтаксис .format(), поэтому в вашем случае .format() не распознает {Hello}, поэтому он сделал ошибку.

вы можете переопределить его, используя двойные фигурные скобки {{}},

x = " {{ Hello }} {0} "

или

попробуйте %s для форматирования текста,

x = " { Hello } %s"
print x%(42)  

Ответ 11

Вы можете использовать String.Template():

from string import Template
s = Template('$txt, $num')
s.substitute(txt='{Hello}', num='42 ')

Ответ 12

Вы можете сделать это, используя метод необработанных строк, просто добавив символ 'r' без кавычек перед строкой.

# to print '{I am inside braces}'
print(r'{I am inside braces}')

Ответ 13

Лучшим решением для меня является использование этого '{ob} Hello {cb} 42'.format(ob='{',cb='}')

Причина, из-за которой удача при использовании принятого ответа напечатать что-то вроде ниже.

a='Header'
ob = '{'
cb = '}' 


str = """
import {a} from '../actions/{a}';

class {a} {ob}
  constructor() {ob}
  {cb}
  somefuncSuccess(){ob}
    if(true){ob}{cb}
  {cb}
{cb}
"""
str = str.format(a=a,ob=ob, cb=cb)
print(str)

Вывод:

import Header from '../actions/Header';

    class Header {
      constructor() {
      }
      somefuncSuccess(){
         if(true){}
      }
    }

Ответ 14

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

>>> "{o}Hello {a}{c}".format(**{"o":"{","c":"}","a":42})
'{Hello 42}'