web-dev-qa-db-fra.com

Comment implémenter le formatage conditionnel des chaînes?

J'ai travaillé sur un jeu texte en Python et j'ai rencontré un cas où je souhaite formater une chaîne différemment en fonction d'un ensemble de conditions. 

Plus précisément, je souhaite afficher du texte décrivant les éléments d'une pièce. Je souhaite que cela soit affiché, dans la description de la pièce, si et seulement si l'objet item en question est dans la liste d'objets de l'objet room. De la manière dont il est configuré, j’estime que concaténer simplement des chaînes basées sur des conditions ne produira pas le résultat souhaité et il serait préférable d’avoir une chaîne différente pour chaque cas. 

Ma question est la suivante: existe-t-il une méthode Pythonic pour formater les chaînes en fonction du résultat d'une condition booléenne? Je pourrais utiliser une structure de boucle for, mais je me demandais s'il y avait quelque chose de plus facile, similaire à une expression génératrice.

Je cherche quelque chose de similaire à cela, sous forme de chaîne

num = [x for x in xrange(1,100) if x % 10 == 0]

Comme exemple général de ce que je veux dire:

print "At least, that's what %s told me." %("he" if gender == "male", else: "she")

Je me rends compte que cet exemple n’est pas valide en Python, mais il montre, en général, ce que je recherche. Je me demande s'il existe une expression valide pour le formatage de chaîne booléenne, similaire à celle ci-dessus . Après quelques recherches, je suis incapable de trouver quoi que ce soit concernant spécifiquement le formatage de chaîne conditionnel. J'ai trouvé plusieurs articles sur les chaînes de format en général, mais ce n'est pas ce que je recherche.

Si quelque chose comme ça existe vraiment, ce serait très utile. Je suis également ouvert à toute autre méthode suggérée. Merci d'avance pour toute aide que vous pouvez fournir.

53
George Osterweil

Votre code est en fait valide Python si vous supprimez deux caractères, la virgule et les deux points.

>>> gender= "male"
>>> print "At least, that's what %s told me." %("he" if gender == "male" else "she")
At least, that's what he told me.

Un style plus moderne utilise .format , cependant:

>>> s = "At least, that's what {pronoun} told me.".format(pronoun="he" if gender == "male" else "she")
>>> s
"At least, that's what he told me."

où l'argument de formatage peut être une dict, vous créez la complexité de votre choix.

87
DSM

Il existe une expression conditionnelle en Python qui prend la forme

A if condition else B

Votre exemple peut facilement être transformé en Python valide en omettant seulement deux caractères:

print ("At least, that's what %s told me." % 
       ("he" if gender == "male" else "she"))

Une alternative que je préfère souvent consiste à utiliser un dictionnaire:

pronouns = {"female": "she", "male": "he"}
print "At least, that's what %s told me." % pronouns[gender]
9
Sven Marnach

Utilisez un littéral de chaîne formaté avec une instruction if 

print(f"""Please close the window{"s" if num_windows > 1 else ""}.""")

J'ai utilisé une chaîne multi-ligne (le guillemet triple, """) pour éviter de mélanger " et ' car vous ne pouvez pas utiliser de barres obliques inverses pour échapper aux guillemets de la chaîne f. Vous pouvez le faire en mélangeant des citations si

print(f'Please close the window{"s" if num_windows > 1 else ""}.')
print(f"Please close the window{'s' if num_windows > 1 else ''}.")

Cela fonctionne dans Python 3.6 et versions ultérieures.

1
Boris