web-dev-qa-db-fra.com

Nouvelle mise en forme de style avec Tuple en argument

Pourquoi ne puis-je pas utiliser Tuple comme argument pour formater dans un nouveau style ("string" .format ())? Cela fonctionne bien dans le style ancien ("chaîne"%)?

Ce code fonctionne:

>>> Tuple = (500000, 500, 5)
... print "First item: %d, second item: %d and third item: %d." % Tuple

    First item: 500000, second item: 500 and third item: 5.

Et cela ne veut pas:

>>> Tuple = (500000, 500, 5)
... print("First item: {:d}, second item: {:d} and third item: {:d}."
...       .format(Tuple))

    Traceback (most recent call last):
     File "<stdin>", line 2, in <module>
    ValueError: Unknown format code 'd' for object of type 'str'

Même avec {! R}

>>> Tuple = (500000, 500, 5)
... print("First item: {!r}, second item: {!r} and third item: {!r}."
...       .format(Tuple))

    Traceback (most recent call last):
     File "<stdin>", line 2, in <module>
    IndexError: Tuple index out of range

Bien que cela fonctionne avec cette façon:

>>> print("First item: {!r}, second item: {!r} and third item: {!r}."
...       .format(500000, 500, 50))

    First item: 500000, second item: 500 and third item: 5.
28
Mark Luther

L'ancienne méthode de formatage utilisait un opérateur binaire, %. De par sa nature, il ne peut accepter que deux arguments. La nouvelle façon de formater utilise une méthode. Les méthodes peuvent prendre n'importe quel nombre d'arguments.

Puisque vous avez parfois besoin de passer plusieurs choses à formater et que créer des n-uplets avec un seul élément tout le temps est un peu lourd Tuple comme les choses à formater. Si vous transmettez autre chose qu'un tuple, il utilisera cela comme la seule chose à formater.

La nouvelle méthode n'a pas besoin d'un tel hack: comme c'est une méthode, elle peut prendre n'importe quel nombre d'arguments. En tant que tel, plusieurs éléments à formater devront être passés en tant qu'arguments séparés. Heureusement, vous pouvez décompresser un tuple en arguments à l'aide de *:

print("First item: {:d}, second item: {:d} and third item: {:d}.".format(*Tuple))
48
icktoofay

Comme l'explique icktoofay , dans l'ancien format de mise en forme, si vous transmettiez un tuple, Python le décompresserait automatiquement.

Cependant, vous ne pouvez pas utiliser un tuple avec la méthode str.format car Python pense que vous ne transmettez qu'un seul argument. Vous devrez décompresser le tuple avec l'opérateur * pour transmettre chacun des éléments sous forme d'argument individuel.

>>> t = (500000, 500, 5)
>>> "First item: {:d}, second item: {:d} and third item: {:d}.".format(*t)
First item: 500000, second item: 500 and third item: 5.

En outre, vous auriez remarqué que j'ai renommé votre variable Tuple en t - n'utilisez pas de noms intégrés pour les variables, vous risqueriez de les écraser, ce qui risquerait de poser des problèmes plus tard.

18
Volatility

Il est en fait possible d'utiliser un tuple comme argument de format(), si vous indexez manuellement le tuple à l'intérieur des accolades:

>>> t = (500000, 500, 5)
>>> print("First item: {0[0]:d}, second item: {0[1]:d} and third item: {0[2]:d}.".format(t))
First item: 500000, second item: 500 and third item: 5.

Je trouve cela moins clair que l'approche *, cependant.

0
1''