Formatage de chaîne de paramètres nommés?

135

Je sais que c'est une question très simple, mais je ne sais pas comment la rechercher sur Google.

Comment puis-je faire

print '<a href="%s">%s</a>' % (my_url)

Alors c'est my_urlutilisé deux fois? Je suppose que je dois "nommer" le %spuis utiliser un dict dans les paramètres, mais je ne suis pas sûr de la syntaxe appropriée?


juste pour info, je suis conscient que je peux juste utiliser my_urldeux fois dans les paramètres, mais ce n'est pas le point :)

mpen
la source
Le titre de la question est un peu trompeur. Cela n'a rien à voir avec l'instruction print, juste avec le fonctionnement de l'interpolation de chaîne.
Greg Ball
Lorsque vous ne savez pas comment le rechercher sur Google, allez ici pour utiliser la recherche: python.org/doc . C'est mieux que Google pour une raison importante.
S.Lott
@ S.Lott C'est vraiment utile / s
mpen

Réponses:

80

Dans Python 2.6+ et Python 3, vous pouvez choisir d'utiliser la nouvelle méthode de formatage de chaîne.

print('<a href="{0}">{0}</a>'.format(my_url))

ce qui vous évite de répéter l'argument, ou

print('<a href="{url}">{url}</a>'.format(url=my_url))

si vous voulez des paramètres nommés.

print('<a href="{}">{}</a>'.format(my_url, my_url))

qui est strictement positionnel, et vient uniquement avec l'avertissement que les arguments de format () suivent les règles Python où les arguments sans nom doivent venir en premier, suivis des arguments nommés, suivis de * args (une séquence comme une liste ou un tuple) et ensuite * kwargs (un dict avec des chaînes si vous savez ce qui est bon pour vous). Les points d'interpolation sont déterminés d'abord en substituant les valeurs nommées à leurs étiquettes, puis en positionnant ce qui reste. Donc, vous pouvez aussi faire ceci ...

print('<a href="{not_my_url}">{}</a>'.format(my_url, my_url, not_my_url=her_url))

Mais pas ça ...

print('<a href="{not_my_url}">{}</a>'.format(my_url, not_my_url=her_url, my_url))
Greg Ball
la source
C'est agréable de voir l'influence passer de ++ à #
cod3monk3y
3
La méthode ci-dessus n'est pas pour le formatage de chaîne nommée , il s'agit d'un formatage de chaîne positionnelle. Cela ne répond donc pas vraiment à la question.
jaapz
Le "literal {arg1}".format(arg1="arg!")format nommé fonctionne avec Python 3.5, tandis que le terser f"literal {arg1}"est une innovation plus récente dans Python 3.6 ou plus récent, AFAIK.
MarkHu
218
print '<a href="%(url)s">%(url)s</a>' % {'url': my_url}
Ignacio Vazquez-Abrams
la source
3
Je préfère créer le dict avec kwargs:'<a href="%(url)s">%(url)s</a>' % dict(url=my_url)
schlamar
11
Je me demande pourquoi vous préférez ce schmlamar? Je n'aurais pas facilement su ce que cela signifiait, comparé la déclaration normale d'un dict que l'OP utilise ...
GreenAsJade
1
La documentation ne dit pas quand cela a été introduit, donc c'est probablement dans toutes les versions de Python 2.
Evgeni Sergeev
2
Utilisez format () si vous le pouvez, cela fonctionne mieux et dans plus d'endroits. Utilisez% si vous DEVEZ.
uchuugaka
39

Solution en Python 3.6+

Python 3.6 introduit le formatage de chaîne littérale , afin que vous puissiez formater les paramètres nommés sans répéter aucun de vos paramètres nommés en dehors de la chaîne:

print(f'<a href="{my_url:s}">{my_url:s}</a>')

Cela évaluera my_url, donc s'il n'est pas défini, vous obtiendrez un fichier NameError. En fait, au lieu de my_url, vous pouvez écrire une expression Python arbitraire, tant qu'elle s'évalue en une chaîne (à cause du :scode de formatage). Si vous voulez une représentation sous forme de chaîne pour le résultat d'une expression qui n'est peut-être pas une chaîne, remplacez-la :spar !s, comme pour le formatage de chaîne pré-littéral normal.

Pour plus d'informations sur le formatage de chaîne littérale, consultez PEP 498 , où il a été introduit pour la première fois.

gerrit
la source
1
Ce PEP ne semble pas couvrir tous les formateurs; Je pense qu'ils sont les mêmes que str.format qui est documenté ici: docs.python.org/3.4/library/string.html#formatstrings
mpen
6

Vous serez accro à la syntaxe.

Aussi C # 6.0, les développeurs EcmaScript ont également familier cette syntaxe.

In [1]: print '{firstname} {lastname}'.format(firstname='Mehmet', lastname='Ağa')
Mehmet Ağa

In [2]: print '{firstname} {lastname}'.format(**dict(firstname='Mehmet', lastname='Ağa'))
Mehmet Ağa
guneysus
la source
5

Pour créer des pages HTML, vous souhaitez utiliser un moteur de création de modèles et non une simple interpolation de chaîne.

Mike Graham
la source
2
Le moteur de création de modèles de Django peut également s'avérer être l'outil idéal pour les e-mails que vous créez.
Mike Graham
6
Qu'est-ce qui vous empêche d'utiliser un modèle Django pour générer un corps d'e-mail avec sa render()méthode? Rien ne dit que vous devez alimenter la sortie du modèle HttpResponse(). Django est extrêmement polyvalent.
Mike DeSimone
1
@Mike: Je pensais que Django pourrait avoir une solution pour ça aussi, mais je ne l'avais pas encore trouvée: p Je vais probablement déplacer mes e-mails dans des modèles alors! Merci. Peut-être que je suis en retard, mais j'ai trouvé que c'était assez rigide dans certains domaines.
mpen
2
@random personnes qui lisent ces commentaires: ont trouvé plus de détails sur la façon de le faire ici rossp.org/blog/2006/jul/11/sending-e-mails-templates
mpen
1
Pour commenter des questions, vous souhaitez utiliser des commentaires, pas des réponses.
suriv
2

En plus de la méthode du dictionnaire, il peut être utile de connaître le format suivant:

print '<a href="%s">%s</a>' % (my_url, my_url)

Ici, c'est un peu redondant, et la méthode du dictionnaire est certainement moins sujette aux erreurs lors de la modification du code, mais il est toujours possible d'utiliser des tuples pour plusieurs insertions. Le premier %sest remplacé par le premier élément du tuple, le second %sest remplacé par le deuxième élément du tuple, et ainsi de suite pour chaque élément du tuple.

Ponkadoodle
la source
Je viens de dire à un gars de l'avoir suggéré :) Il a supprimé son message. Je me sens un peu mal maintenant. Oui, je sais que je peux le faire, mais ce n'était tout simplement pas ce que je recherchais. Comme vous l'avez dit, c'est redondant et my_urlc'est en fait un appel de fonction que je ne veux pas avoir à évaluer deux fois. Deux fois, ce n'est pas si mal, mais cela aurait pu facilement être 20 fois :)
mpen
5
J'ai pensé que je garderais le mien, juste au cas où cela aiderait quelqu'un d'autre. Eh bien, la méthode du dictionnaire est probablement la meilleure façon de procéder. Mais pour la redondance, (get_my_url(), )*20n'appelle la fonction qu'une seule fois et la duplique 20 fois.
Ponkadoodle