Mettre des crochets { dans un string avec .format

Le
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
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
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Alain Ketterlin
Le #23537351
Laurent Claessens
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.
Laurent Claessens
Le #23537491
Le 06/07/2011 11:11, Alain Ketterlin a écrit :
Laurent Claessens
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
Pierre Maurette
Le #23537761
Laurent Claessens :
Le 06/07/2011 11:11, Alain Ketterlin a écrit :
Laurent Claessens
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
Laurent Claessens
Le #23537781
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
Laurent Pointal
Le #23538711
Alain Ketterlin wrote:

Laurent Claessens
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
Alain Ketterlin
Le #23538831
Laurent Pointal
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.
Laurent Pointal
Le #23539111
Alain Ketterlin wrote:

Laurent Pointal
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.
Laurent Claessens
Le #23540441
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
Publicité
Poster une réponse
Anonyme