Python Language Formatage personnalisé pour une classe


Exemple

Remarque:

Tout ce qui suit s'applique à la méthode str.format , ainsi qu'à la fonction de format . Dans le texte ci-dessous, les deux sont interchangeables.

Pour chaque valeur transmise à la fonction format , Python recherche une méthode __format__ pour cet argument. Votre propre classe personnalisée peut donc avoir sa propre méthode __format__ pour déterminer comment la fonction de format affichera et formatera votre classe et ses attributs.

Ceci est différent de la méthode __str__ , car dans la méthode __format__ , vous pouvez prendre en compte le langage de formatage, y compris l'alignement, la largeur des champs, et même (si vous le souhaitez) implémenter vos propres spécificateurs de format et vos propres extensions de langage de formatage. 1

object.__format__(self, format_spec)

Par exemple :

# Example in Python 2 - but can be easily applied to Python 3

class Example(object):
    def __init__(self,a,b,c):
        self.a, self.b, self.c = a,b,c

    def __format__(self, format_spec):
        """ Implement special semantics for the 's' format specifier """
        # Reject anything that isn't an s
        if format_spec[-1] != 's':
            raise ValueError('{} format specifier not understood for this object', format_spec[:-1])

        # Output in this example will be (<a>,<b>,<c>)
        raw = "(" + ",".join([str(self.a), str(self.b), str(self.c)]) + ")"
        # Honor the format language by using the inbuilt string format
        # Since we know the original format_spec ends in an 's' 
        # we can take advantage of the str.format method with a 
        # string argument we constructed above
        return "{r:{f}}".format( r=raw, f=format_spec )

inst = Example(1,2,3)
print "{0:>20s}".format( inst )
# out :              (1,2,3)
# Note how the right align and field width of 20 has been honored.

Remarque:

Si votre classe personnalisée n'a pas une coutume __format__ méthode et une instance de la classe est passée à la format fonction, python2 utilisera toujours la valeur de retour de la __str__ méthode ou __repr__ méthode pour déterminer ce qu'il faut imprimer (et si elles existent ni alors la default repr sera utilisé), et vous devrez utiliser le spécificateur de format s pour le formater. Avec Python3 , pour passer votre classe personnalisée à la fonction format , vous aurez besoin de définir la méthode __format__ sur votre classe personnalisée.