!s
, et de ses frères !a
et !r
s'applique str()
, ascii()
et repr()
respectivement avant d'interpolation et de mise en forme. Ceux-ci sont appelés indicateurs de conversion, et font partie de la Chaîne de Format Syntaxe spec, pas le par-mise en forme de champ spec appliqué à des valeurs lors de l'interpolation:
La conversion champ provoque une contrainte de type avant de formater. Normalement, le travail de mise en forme d'une valeur se fait par l' __format__()
méthode de la valeur elle-même. Cependant, dans certains cas, il est souhaitable de forcer un type à être mis en forme comme une chaîne de caractères, en substituant sa propre définition de la mise en forme. Par conversion de la valeur à une chaîne de caractères avant d'appeler __format__()
, la logique de mise en forme est court-circuité.
En gras c'est moi qui souligne.
:s
ne s'applique ensuite du résultat de la conversion (ou de l'objet d'origine si aucune conversion n'a été appliqué), et que si l' __format__
méthode pour le type d'objet prend en charge que l'option de mise en forme. Habituellement, seuls les objets de type str
soutenir ce formateur; c'est là en tant que par défaut, surtout parce que la Spécification de Format Mini-Langage permet l'existence d'un type de personnage et parce que le plus âgé %
printf
-mise en forme du style avait un %s
format. Si vous avez essayé d'appliquer l' s
type d'un objet qui n'est pas en charge, vous obtiendrez une exception.
Utiliser !s
(ou !a
ou !r
) lorsque vous avez un objet qui n'est pas elle-même une chaîne de caractères et ne prend pas en charge le formatage dans le cas contraire (pas tous les types de le faire) ou format différent de celui de leurs str()
, ascii()
ou repr()
conversions:
>>> class Foo:
... def __str__(self):
... return "Foo as a string"
... def __repr__(self):
... return "<Foo as repr, with åéæ some non-ASCII>"
... def __format__(self, spec):
... return "Foo formatted to {!r} spec".format(spec)
...
>>> print("""\
... Different conversions applied:
... !s: {0!s:>60s}
... !r: {0!r:>60s}
... !a: {0!a:>60s}
... No conversions: {0:>50s}
... """.format(Foo()))
Different conversions applied:
!s: Foo as a string
!r: <Foo as repr, with åéæ some non-ASCII>
!a: <Foo as repr, with \xe5\xe9\xe6 some non-ASCII>
No conversions: Foo formatted to '>50s' spec
Note: tous les mise en forme spécifiée par le format spec sont de la responsabilité de l' __format__
méthode; la dernière ligne ne s'applique pas à l'opération d'alignement dans l' >50s
mise en forme spec, l' Foo.__format__
méthode utilisée uniquement comme le texte littéral dans une opération de mise en forme (à l'aide d'un !r
conversion ici).
Pour les valeurs converties, d'autre part, l' str.__format__
méthode est utilisée et que la sortie est aligné à droite dans une de 50 caractères champ très large, rembourré avec des espaces à gauche.