% ou format() en Python ?

On a réçu un mail du genre :

Salut les mecs!

Je me demandais si il valait mieux utiliser format() ou % quand on veut insérer une variable dans une chaîne?
Je comprend pas vraiment quelle est la différence entre les deux…l’un est-il plus rapide? Plus fiable?

Merci les mecs!

Donc je suppose que d’autres personnes se posent la même question, du coup je poste ça là une bonne fois pour toute.

En résumé :

% c’est la manière de faire de Python 2, format(), c’est du Python 3. Mais format() a été backporté en Python 2.6.

Du coup, utilisez toujours format(), ça facilite le portage du code et ça donne de bonnes habitudes. Les mecs comme moi ont encore du mal (je me force) et parfois laissent échapper un % par réflexe, surtout que c’est plus court à taper et qu’on est des fainéants. D’ailleurs les anciens articles du blogs le montrent. C’est pas une excuse. format() pour tout le monde, et que ça saute !

No related posts.

flattr this!

16 comments

  1. Etienne
    print u"Moi %s {0} %s chier".format("me") % (u"{evol} %s ".format(evol=u"l'évolution"), u"fait") % u"ça"
  2. Etienne

    Pardon, c’est pas très lisible:

    print u"Moi %s {0} %s chier".format("me")\
     % (u"{evol} %s ".format(evol=u"l'évolution")\
    , u"fait") % u"ça"
  3. Une autre raison que “c’est comme ça qu’il faut faire” ?

    % marche aussi en python 3

    Accessoirement certaines syntaxes syntaxe de .format() sont valides en python 3, mais pas en python 2.6

    Exemple :

    "welcome {}".format("bar")
  4. mothsART

    Les 2 ne sont pas plutôt complémentaires sur python 3?

    D’ailleurs :
    print('yes %s can!' % 'we')
    marche très bien sur la 3.3!

  5. Wow, 10 ans de Python et je viens d’apprendre que “%” est conservé en Python 3. J’étais persuadé qu’il était deprecated.

    Bon, ça vallait le coup de faire l’article rien que pour ça.

    Merci de m’apprendre des trucs tous les jours. Et merci de le faire aussi gentiment.

  6. Oh le mauvais !!! *lapidation*

    Par contre je viens d’apprendre de @Romuald que 2.6 ne supportait pas toutes les syntaxes … Content d’avoir toujours utilisé % pour les simples remplacements :)

  7. kontre

    J’ai cru lire que % était un chouilla plus rapide, ne serait-ce que parce qu’il a moins de fonctionnalités.

    Mais % c’est l’héritage des langages C-like, alors que .format() c’est plus pythonesque. (mais je suis moi aussi une grosse feignasse, à vrai dire)

  8. Je ne dis pas que format() n’est pas utile mais perso je n’en ai pas encore eu l’utilité et le % me convient très bien. Clair, rapide à taper et facile à relire et en plus conservé en Python3.
    Pourquoi alors se compliquer la vie…?

  9. Mais alors, comment utiliser format si on a un {} dans la chaine à manipuler?

    Exemple:


    In [20]: "Je veux inserer [0] dans une chaine contenant {zobi=lamouche}".format("ceci")
    ---------------------------------------------------------------------------
    KeyError Traceback (most recent call last)
    in ()
    ----> 1 "Je veux inserer [0] dans une chaine contenant {zobi=lamouche}".format("ceci")

    KeyError: 'zobi=lamouche'

  10. >>> "Je veux inserer {0} dans une chaine contenant {{zobi=lamouche}}".format("ceci")
    u'Je veux inserer ceci dans une chaine contenant {zobi=lamouche}'
  11. Terrible!!!

    Merci!

  12. format, c’est quand même bien quand dans une substitution, on veut utiliser plusieurs fois un terme

    In [2]: print('{0} {0} {0}'.format('bon'))
    bon bon bon

  13. C’est aussi mieux pour les variables nommées. %(nom)s c’est plus chiant à tapper que {nom}

  14. Stéphane

    Juste une coquille (deux corrections):
    feinénants -> fainéants

  15. Salut,

    Le “old %-formatting” est déprécié depuis 2.6.

    http://docs.python.org/library/stdtypes.html#str.format

  16. C’est ce que je croyais aussi, mais en fait il est toujours là dans les dernières versions de Python 3.

Flux RSS des commentaires

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Jouer à mario en attendant que les autres répondent