Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Mettre des crochets { dans un string avec .format

8 réponses
Avatar
Laurent Claessens
Bonjour


Je voudrais utiliser la super syntaxe "{0.blabla}".format(blibli)
pour générer un peu de code LaTeX automatiquement.

Mon problème est que LaTeX est très friand de "{" et de "}", donc je
dois pouvoir mettre des crochets explicites à l'intérieur d'une chaine
dont certains crochets sont pour la syntaxe python(2.6, Ubuntu Lucid)

Le code suivant
-------------------------------
x=10
print "\MyCommand{{0}}".format(x)
-------------------------------


prduit l'erreur :
-------------------------------
Traceback (most recent call last):
File "./ess.py", line 6, in <module>
print "\MyCommand{ {0} }".format(x)
KeyError: ' {0} '
-------------------------------

Le résultat attendu était
\MyCommand{10}


Je comprends pourquoi, mais je ne sais pas comment parvenir à mes fins.

Chose marrante (que je ne comprends pas): si j'enlève les espaces, j'ai
pas d'erreur, mais pas non plus le résultat attendu :

-------------------------------
x=10
print "\MyCommand{{0}}".format(x)
-------------------------------
produit
\MyCommand{0}



J'ai essayé d'ajouter des \ devant les crochets, mais sans succès.
Typiquement, il me met
ValueError: Single '}' encountered in format string


Bref, ma question est : comment produire la chaine "\MyCommand{10}"
lorsque le 10 est la valeur d'une variable, en utilisant la syntaxe avec
.format ?
(si j'utilise %s et %str(x), je peux le faire)


Bonne journée
Laurent

8 réponses

Avatar
Alain Ketterlin
Laurent Claessens writes:

Mon problème est que LaTeX est très friand de "{" et de "}", do nc je
dois pouvoir mettre des crochets explicites à l'intérieur d'une chaine
dont certains crochets sont pour la syntaxe python(2.6, Ubuntu Lucid)



http://docs.python.org/library/string.html#format-string-syntax

"If you need to include a brace character in the literal text, it can be
escaped by doubling: {{ and }}."

-------------------------------
x
print "MyCommand{{0}}".format(x)
-------------------------------



print "MyCommand{{{0}}}".format(x)

(Note le double , ça ne change rien dans ton exemple mais tu verras la
différence, par exemple, avec "texttt...".)

-- Alain.
Avatar
Laurent Claessens
Le 06/07/2011 11:11, Alain Ketterlin a écrit :
Laurent Claessens writes:

Mon problème est que LaTeX est très friand de "{" et de "}", donc je
dois pouvoir mettre des crochets explicites à l'intérieur d'une chaine
dont certains crochets sont pour la syntaxe python(2.6, Ubuntu Lucid)



http://docs.python.org/library/string.html#format-string-syntax

"If you need to include a brace character in the literal text, it can be
escaped by doubling: {{ and }}."



for i in range(1,100):
print "Je lirai la doc avant de poser une question"


merci pour le lien
Laurent
Avatar
Pierre Maurette
Laurent Claessens :
Le 06/07/2011 11:11, Alain Ketterlin a écrit :
Laurent Claessens writes:

Mon problème est que LaTeX est très friand de "{" et de "}", donc je
dois pouvoir mettre des crochets explicites à l'intérieur d'une chaine
dont certains crochets sont pour la syntaxe python(2.6, Ubuntu Lucid)



http://docs.python.org/library/string.html#format-string-syntax

"If you need to include a brace character in the literal text, it can be
escaped by doubling: {{ and }}."



for i in range(1,100):
print "Je lirai la doc avant de poser une question"



Hum, si la sanction était /Vous me copierez cent fois.../, c'est pas
bon ;-)

--
Pierre Maurette
Avatar
Laurent Claessens
nge(1,100):
print "Je lirai la doc avant de poser une question"



Hum, si la sanction était /Vous me copierez cent fois.../, c'est pas
bon ;-)



99 fois dans la boucle et une fois dans le code. Le compte est bon.

Bonne aprème
Laurent
Avatar
Laurent Pointal
Alain Ketterlin wrote:

Laurent Claessens writes:

Mon problème est que LaTeX est très friand de "{" et de "}", donc je
dois pouvoir mettre des crochets explicites à l'intérieur d'une chaine
dont certains crochets sont pour la syntaxe python(2.6, Ubuntu Lucid)



http://docs.python.org/library/string.html#format-string-syntax

"If you need to include a brace character in the literal text, it can be
escaped by doubling: {{ and }}."

-------------------------------
x
print "MyCommand{{0}}".format(x)
-------------------------------



print "MyCommand{{{0}}}".format(x)

(Note le double , ça ne change rien dans ton exemple mais tu verras la
différence, par exemple, avec "texttt...".)

-- Alain.




Tu peux aussi te créer une fonction

def crochete(x):
return "{"+x+"}"

Et ensuite utiliser:

r"MyCommand{0}".format(crochete(x))

Le r permet d'éviter le double
Avatar
Alain Ketterlin
Laurent Pointal writes:

x
print "MyCommand{{0}}".format(x)



print "MyCommand{{{0}}}".format(x)



def crochete(x):
return "{"+x+"}"



-> TypeError: cannot concatenate 'str' and 'int' objects

(dans l'exemple de Laurent)

r"MyCommand{0}".format(crochete(x))



L'avantage de format, c'est qu'il s'occupe lui-même d'appeler
__format__() (ou str() ou repr() selon les cas).

-- Alain.
Avatar
Laurent Pointal
Alain Ketterlin wrote:

Laurent Pointal writes:

x
print "MyCommand{{0}}".format(x)







print "MyCommand{{{0}}}".format(x)





def crochete(x):
return "{"+x+"}"



-> TypeError: cannot concatenate 'str' and 'int' objects

(dans l'exemple de Laurent)

r"MyCommand{0}".format(crochete(x))



L'avantage de format, c'est qu'il s'occupe lui-même d'appeler
__format__() (ou str() ou repr() selon les cas).

-- Alain.



Ajouter un str(x) ferait l'affaire, trivial, par contre en effet on perd les
capacités de formatage (et de la richesse du paramétrage de format). A voir
selon l'usage et la lourdeur potentielle des {{{ }}} dans les écritures.
Avatar
Laurent Claessens
Ajouter un str(x) ferait l'affaire, trivial, par contre en effet on perd les
capacités de formatage (et de la richesse du paramétrage de format). A voir
selon l'usage et la lourdeur potentielle des {{{ }}} dans les écritures.



Effectivement. Dans le problème réel, c'est plutôt
r"MyCommand{0.jambon}{0.oeuf}".format(x)

où x est un objet de type perso et x.jambon est un string et x.oeuf est
un nombre.

Je vais plutôt mettre les doubles crochets.

Merci
Laurent