Pregunta ¿Cómo puedo imprimir caracteres literalmente de llaves en cadena de pitón y también usar .format en él?


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

me da: Key Error: Hello\\

Quiero imprimir el resultado: {Hello} 42


930
2018-03-29 00:04


origen


Respuestas:


Necesitas duplicar el {{ y }}:

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

Aquí está la parte relevante de la Documentación de Python para sintaxis de cadenas de formato:

Las cadenas de formato contienen "campos de reemplazo" rodeados de llaves {}. Cualquier cosa que no esté contenida en llaves se considera texto literal, que se copia sin cambios a la salida. Si necesita incluir un carácter de paréntesis en el texto literal, se puede escanear doblando: {{ y }}.


1267
2018-03-29 00:08



Usted escapa doblando las llaves.

P.ej:

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

52
2018-03-29 00:08



Intenta hacer esto:

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

24
2018-03-29 00:08



Prueba esto:

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


20
2018-03-29 00:08



El OP escribió este comentario:

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

Es bastante común que aparezca el problema de "frenar llaves" cuando se trata de JSON.

Sugiero hacer esto:

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

Es más limpio que la alternativa, que es:

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

Utilizando el json la biblioteca es definitivamente preferible cuando la cadena JSON se vuelve más complicada que en el ejemplo.


19
2018-06-06 18:59



Aunque no es mejor, solo como referencia, también puedes hacer esto:

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

Puede ser útil, por ejemplo, cuando alguien quiere imprimir {argument}. Es quizás más legible que '{{{}}}'.format('argument')

Tenga en cuenta que omite posiciones de argumento (p. {} en lugar de {0}) después de Python 2.7


9
2017-11-05 11:22



Python 3.6 (2017)

En la versión actual de Python uno usaría f-cuerdas (ver también PEP498)

También con f-strings uno debe usar el doble {{ o }}

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

produce el deseado

 {Hello} 42

7
2017-12-21 11:12



Si vas a hacer mucho esto, sería bueno definir una función de utilidad que te permita usar sustitutos arbitrarios alternativos, como

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}'

Tenga en cuenta que esto funcionará con paréntesis siendo una cadena de longitud 2 o una iterable de dos cadenas (para delimitadores de múltiples caracteres).


4
2017-11-29 23:43



La razón es , {} es la sintaxis de .format() entonces en tu caso .format() no reconoce {Hello} por lo que arrojó un error.

puede anularlo usando llaves dobles {{}},

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

o

tratar %s para el formato de texto,

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

1
2018-06-27 12:40



Si tiene que poner llaves alrededor de un valor de una clave de los diccionarios de parámetros o las listas del método de formato, intente lo siguiente:

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

-5
2018-02-15 14:39