Je suis un grand fan de l'utilisation de dictionnaires pour formater les chaînes. Cela m'aide à lire le format de chaîne que j'utilise et me permet de profiter des dictionnaires existants. Par exemple:
class MyClass:
def __init__(self):
self.title = 'Title'
a = MyClass()
print 'The title is %(title)s' % a.__dict__
path = '/path/to/a/file'
print 'You put your file here: %(path)s' % locals()
Cependant, je ne peux pas comprendre la syntaxe python 3.x pour faire la même chose (ou si c'est même possible). Je voudrais faire ce qui suit
# Fails, KeyError 'latitude'
geopoint = {'latitude':41.123,'longitude':71.091}
print '{latitude} {longitude}'.format(geopoint)
# Succeeds
print '{latitude} {longitude}'.format(latitude=41.123,longitude=71.091)
Est-ce que c'est bon pour toi?
la source
format_map
. Similaire àstr.format(**mapping)
, sauf qu'ilmapping
est utilisé directement et non copié dans adict
. Ceci est utile si, par exemple, ilmapping
s'agit d'une sousprint(**geopoint)
-à- dire commeprint(longitude=71.091, latitude=41.123)
. Dans de nombreuses langues, il est connu comme opérateur splat . En JavaScript, cela s'appelle l' opérateur de propagation . En python, aucun nom particulier n'est donné à cet opérateur.Pour décompresser un dictionnaire en arguments de mots clés, utilisez
**
. De plus, la mise en forme de nouveau style prend en charge la référence aux attributs des objets et des éléments des mappages:la source
'{0[latitude]} {1[latitude]} {0[longitude]} {1[longitude]}'.format(geopoint0, geopoint1)
defaultdict
et que vous n'avez pas toutes les clésComme Python 3.0 et 3.1 sont en fin de vie et que personne ne les utilise, vous pouvez et devez utiliser
str.format_map(mapping)
(Python 3.2+):Cela signifie que vous pouvez utiliser par exemple un
defaultdict
qui définirait (et renverrait) une valeur par défaut pour les clés manquantes:Même si le mappage fourni est une
dict
, et non une sous-classe, ce serait probablement encore un peu plus rapide.La différence n'est pas grande cependant, étant donné
puis
est environ 10 ns (2%) plus rapide que
sur mon Python 3.4.3. La différence serait probablement plus grande car il y a plus de clés dans le dictionnaire, et
Notez que le langage de format est bien plus flexible que cela cependant; ils peuvent contenir des expressions indexées, des accès aux attributs, etc., vous pouvez donc formater un objet entier ou 2 d'entre eux:
À partir de 3.6, vous pouvez également utiliser les chaînes interpolées:
Vous devez juste vous rappeler d'utiliser les autres caractères de guillemet dans les guillemets imbriqués. Un autre avantage de cette approche est qu'elle est beaucoup plus rapide que d' appeler une méthode de formatage.
la source
format
? (Étant donné qu'il n'est pas copié dans un dict)'%(latitude)s %(longitude)s'%geopoint
;)la source
La syntaxe Python 2 fonctionne également dans Python 3:
la source
f""
ou"".format()
;)la source
print('%(latitude)s %(longitude)s'%geopoint)
c'est aussi beaucoup plus rapide que les 2 autres'%(geopoint["latitude"])s %(geopoint["longitude"])s'%{"geopoint":geopoint}
La plupart des réponses ont formaté uniquement les valeurs du dict.
Si vous souhaitez également formater la clé dans la chaîne, vous pouvez utiliser dict.items () :
Production:
Si vous souhaitez formater de manière arbitraire, c'est-à-dire sans afficher les valeurs-clés comme les tuples:
Production:
la source
geopoint.items()
;)