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


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

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

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

10 960

10 ответов:

вам нужно удвоить {{ и }}:

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

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

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

вы избегаете его, удваивая фигурные скобки.

например:

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

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

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

попробуйте это:

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

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

I was trying to format a small JSON for some purposes, like this: '{"all": false, "selected": "{}"}'.format(data) to get something like {"all": false, "selected": "1,2"}

это довольно распространено, что проблема "escaping braces" возникает при работе с JSON.

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

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

Это чище, чем альтернатива, которая заключается в:

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

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

Python 3.6+ (2017)

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

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

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

производит нужные

 {Hello} 42

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

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

производит

{hello}

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

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

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

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

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

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, либо с итерацией двух строк (для многозначных разделителей).

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

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

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

или

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

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

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

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