• [^] # Re: J'aime pas les %

    Posté par (site web personnel) . En réponse au journal Il faut sauver le soldat %. Évalué à 7.

    Déjà, la notation « format % arguments » est une des seules à utiliser des opérateurs, alors que la grande majorité utilise des méthodes (ex: chaine.strip()) ou des fonctions, (ex: len(chaine)). C'est une exception au langage qui n'est pas homogène avec le reste du langage.

    Cette notation souffre de défauts, il existe la forme « "%s" % var » et la forme « "%s" % (var1, var2) », et la première est source de problèmes :
    >>> x="1 2"; print "%s" % x
    1 2
    >>> x=(1, 2); print "%s" % x
    Traceback (most recent call last):
    File "", line 1, in
    TypeError: not all arguments converted during string formatting

    Il est difficile d'expliquer pourquoi « parfois ça marche, parfois non ». Il faut utiliser la 2e forme qui est plus laide (virgule toute seule qui semble bizzare) dans ce cas :
    >>> x=(1, 2); print "%s" % (x,)
    (1, 2)

    Il existe une 3e forme où les arguments sont nommés :
    >>> print "%(truc)s" % {'truc': (1, 2)}
    (1, 2)

    Le problème est le suffixe S qui semble sorti de nulle part et qu'on oublie facilement :
    >>> print "%(truc)" % {'truc': (1, 2)}
    Traceback (most recent call last):
    File "", line 1, in
    ValueError: incomplete format

    Bref, la notation « format % arguments » est concise mais est source de problèmes subtiles, difficile à voir pour un œil non entrainé.

    Anecdote : La traduction française de Gajim comportait un bug. Je me souviens plus des détails, mais c'était une erreur du genre : « Login : %(login)s » qui était traduit « Identifiant : %(login) ». Le S étant oublié, le formatage de la chaîne lance une erreur. Mais bon, je pense qu'un traducteur (très souvent quelqu'un qui ne programme pas) peut aussi faire des bêtises avec la notation "{...}".