web-dev-qa-db-fra.com

Utilisation de f-string avec un format dépendant d'une condition

Comment puis-je utiliser une chaîne f avec logique pour formater un int en float? J'aimerais que ppl soit True pour formater num à 2 décimales, et si ppl est False pour le reformater comme quoi que ce soit c'est.

Quelque chose comme string = f'i am {num:.2f if ppl else num}' mais cela ne fonctionne pas. Le code ci-dessous montre le comportement que je veux obtenir avec une f-string plus simple si possible:

ppl = True
num = 3
string = f'I am {num:.2f}' if ppl else f'I am {num}'
print(string)
#if ppl False
#=> i am 3
#if ppl True
#=> i am 3.00
15
jacobcan118

Vous pouvez imbriquer des expressions pour évaluer des expressions internes dans une f-chaîne. Cela signifie que vous pouvez déplacer le ternaire à l'intérieur de votre f-string:

string = f'I am {num:{".2f" if ppl else ""}}'

Notez la paire supplémentaire de croisillons nécessaires pour l'imbrication.

Mais je ne pense pas que ce soit plus propre. Personnellement, j'ai du mal à analyser ce qui se passe ici, contrairement à votre version originale claire. Après tout, simple vaut mieux que complexe; plat est mieux que niché.

22
Andras Deak

Je vous recommande de séparer la fstring en deux lignes

num_str = f'{num:.2f}' if ppl else f'{num}'
str = f'I am {num_str}'

De cette façon, chaque ligne est aussi simple que possible.

2
Gamrix