1401 votes

Mise en forme de string Python : % vs .format

La version 2.6 de Python introduite la chaîne.format() la méthode avec une syntaxe légèrement différente à partir de l'opérateur%. Qui est le meilleur et pour quelles situations?

  1. Les utilisations suivantes de chaque méthode et a le même résultat, quelle est donc la différence?

    #!/usr/bin/python
    sub1 = "python string!"
    sub2 = "an arg"
    
    a = "i am a %s"%sub1
    b = "i am a {0}".format(sub1)
    
    c = "with %(kwarg)s!"%{'kwarg':sub2}
    d = "with {kwarg}!".format(kwarg=sub2)
    
    print a    # "i am a python string!"
    print b    # "i am a python string!"
    print c    # "with an arg!"
    print d    # "with an arg!"
    
  2. En outre, quand la mise en forme de chaîne se produire en python? par exemple, si mon niveau d'enregistrement est défini sur ÉLEVÉ serai-je encore en prendre un coup pour la réalisation de la suite de % opération? Et si oui, est-il un moyen pour éviter cela?

    log.debug("some debug info: %s" % some_info)
    

973voto

Claudiu Points 58398

Pour répondre à votre première question... .format me semble plus sophistiqué, dans de nombreux moyens. Vous pouvez faire des choses comme le re-utiliser des arguments, que vous ne pouvez pas faire avec %. Une chose désagréable à propos de % est aussi comment il peut prendre une variable ou un tuple. Vous pensez que le suivant serait pour toujours:

"hi there %s" % name

pourtant, si name arrive à être (1, 2, 3), il va jeter un TypeError. Pour garantir qu'il permet d'imprimer, vous devez faire

"hi there %s" % (name,)   # supply the single argument as a single-item tuple

qui est juste laid. .format n'ont pas de ces questions. Également dans le deuxième exemple que vous avez donné, l' .format exemple est beaucoup plus propre à la recherche.

Pourquoi ne pas l'utiliser?

  • ne sachant pas à ce sujet (moi avant de lire cet)
  • avoir pour être compatible avec Python 2.5

Pour répondre à votre deuxième question, la mise en forme de chaîne qui se passe en même temps que de toute autre opération, - lorsque la chaîne de mise en forme de l'expression est évaluée. Et Python, n'étant pas un paresseux langue, évalue les expressions avant d'appeler les fonctions, donc, dans votre log.debug exemple, l'expression "some debug info: %s"%some_infoallons d'abord évaluer, par exemple, "some debug info: roflcopters are active", alors que la chaîne sera transmis à l' log.debug().

314voto

eyquem Points 9942

Quelque chose que l’opérateur modulo (%) ne peut pas faire, autant que je sache :

résultat

Très utile.

Un autre point : format() étant une fonction, il peut être utilisé comme argument dans d’autres fonctions :

résultat

154voto

Wooble Points 35620

En supposant que vous utilisez python module, vous pouvez passer la chaîne mise en forme des arguments comme arguments à la méthode plutôt que de faire la mise en forme vous-même :

qui évite de faire la mise en forme à moins que le journal enregistre en fait quelque chose.

62voto

BrainStorm Points 1058

Aussi, PEP 3101 propose de remplacer le `` opérateur avec la nouvelle avancée chaîne mise en forme en python 3, où il pourrait être la valeur par défaut.

57voto

khrf Points 510

Mais attention, tout à l'heure j'ai découvert un problème lorsque vous essayez de remplacer tous les % à .format dans le code existant: '{}'.format(unicode_string) va essayer de coder unicode_string et va probablement échouer

Il suffit de regarder ce python interactif journal de la session:

Python 2.7.2 (default, Aug 27 2012, 19:52:55) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2
; s='й'
; u=u'й'
; s
'\xd0\xb9'
; u
u'\u0439'

donc, s est juste une chaîne de caractères (appelée "tableau d'octets' en python3) et u est une chaîne unicode (appelé "chaîne" en python3)

; '%s' % s
'\xd0\xb9'
; '%s' % u
u'\u0439'

quand vous donnez un unicode objet en tant que paramètre d'opérateur % il va produire une chaîne unicode, même si la chaîne de caractères d'origine n'était pas unicode

; '{}'.format(s)
'\xd0\xb9'
; '{}'.format(u)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'latin-1' codec can't encode character u'\u0439' in position 0: ordinal not in range(256)

mais .fonction de formatage de soulever UnicodeEncodeError

; u'{}'.format(s)
u'\xd0\xb9'
; u'{}'.format(u)
u'\u0439'

et il va travailler avec unicode argument amende seulement si la chaîne d'origine était une unicode

; '{}'.format(u'i')
'i'

ou si l'argument de chaîne peut être converti en une chaîne (dénommé le "tableau d'octets')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X