49 votes

Une façon plus courte et plus pythique d'écrire une instruction if.

J'ai ceci

bc = 'off'

if c.page == 'blog':
    bc = 'on'

print(bc)

Existe-t-il une manière plus pythonique (et/ou plus courte) d'écrire ceci en Python ?

9 votes

Est-ce que vous ont pour utiliser 'on' et 'off' ? Est-ce que cette information pourrait être représentée par un simple booléen, je veux dire bc = (c.page == 'blog') est beaucoup mieux.

103voto

freiksenet Points 1764

Le plus court devrait être :

bc = 'on' if c.page=='blog' else 'off'

En général, cela peut sembler un peu confus, donc vous ne devez l'utiliser que lorsque sa signification est claire. Ne l'utilisez pas pour les grandes clauses booléennes, car cela devient vite laid.

65voto

Arkady Points 4015

C'est ça :

  1. définitivement plus court
  2. sans doute Pythonic (pré-Python 2.5, qui a introduit la controversée X if Z else Y syntaxe)
  3. discutablement lisible. Avec ces réserves à l'esprit, c'est parti :

    bc = ("off","on")[c.page=="blog"]

EDIT : Comme demandé, la forme généralisée est :

   result = (on_false, on_true)[condition]

Explication : condition peut être tout ce qui est évalué comme un booléen. Il est alors traité comme un entier puisqu'il est utilisé pour indexer le tuple : False == 0 , True == 1 qui sélectionne ensuite le bon élément dans le tuple.

0 votes

Fascinant. Comme pour une autre personne ci-dessus, pourriez-vous généraliser un peu plus et expliquer cela ? (Comme dans ... vous ne plaisantiez pas avec le numéro 3).

0 votes

("off", "on") est un tuple et c.page=="blog" évalue l'index de l'élément auquel on accède.

3 votes

Je voulais voter contre parce que c'est vraiment moche, puis je me suis souvenu que je l'ai utilisé moi-même.

32voto

John Lockwood Points 1545

Je ne suis pas un spécialiste de Python, mais j'ai écrit (et, avec plus de difficultés, lire ) beaucoup de code intelligent au fil des ans, je me retrouve maintenant avec une forte préférence pour le code lisible. J'ai compris l'essentiel de ce que faisait votre code original, même si je ne suis pas un spécialiste de Python. Bien sûr, vous pourriez le cacher et peut-être impressionner un ou deux spécialistes de Python, mais pourquoi ?

0 votes

En C, on utilise i++. Le "si" pythique peut être utilisé comme raccourci pour des conditionnelles évidentes, tout comme i++ ou i+= peuvent être utilisés comme raccourcis pour des opérations évidentes.

1 votes

@freiksenet : Je pense qu'une meilleure comparaison est l'utilisation des instructions ? : dans d'autres langues pour des conditionnels courts et simples -- en ligne --. Et, sans doute, celles-ci peuvent rendre le code plus lisible plutôt que de l'encombrer de lignes supplémentaires qui n'ajoutent aucune fonctionnalité.

4 votes

Pour information, "pythonique" est un terme qui privilégie la lisibilité à la complexité.

15voto

Mark Rushakoff Points 97350

Vous pouvez utiliser une instruction if en ligne :

>>> cpage = 'blog'
>>> bc = 'on' if cpage == 'blog' else 'off'
>>> bc
'on'
>>> cpage = 'asdf'
>>> bc = 'on' if cpage == 'blog' else 'off'
>>> bc
'off'

Il y a un article sur cette fonctionnalité à l'adresse suivante ce blog et le PEP pertinent est PEP308 . L'instruction inline if a été introduite dans Python 2.5.

Celle-ci est moins pythique, mais vous pouvez utiliser and / or de cette manière :

>>> cpage = 'asdf'
>>> bc = (cpage == 'blog') and 'on' or 'off'
>>> bc
'off'
>>> cpage = 'blog'
>>> bc = (cpage == 'blog') and 'on' or 'off'
>>> bc
'on'

Celle-ci est plus souvent utilisée dans des instructions lambda que sur une ligne par elle-même, mais la forme

 A and B or C

est similaire à

   if A:
       return B
   else:
       return C

La principale mise en garde concernant cette méthode (comme PEP 308 mentionne ) est qu'il renvoie C cuando B est fausse.

1 votes

Le deuxième semble realmente déroutant. Pouvez-vous développer la réponse pour expliquer pourquoi cela fonctionne ainsi ?

1 votes

Merci pour l'explication. C'est toujours très illisible pour moi. Je pense que la première option est meilleure.

0 votes

La deuxième option est ce que les gens utilisaient avant que nous ayons la première, dans les cas où il était plus important d'entasser les choses sur une ligne que de les lire

4voto

user135331 Points 141

Une autre possibilité est d'utiliser un dict si vous pouvez calculer les valeurs en dehors de la fonction qui y accède (c'est-à-dire que les valeurs sont statiques, ce qui résout également le problème d'évaluation dans les commentaires de la réponse de scrible).

want_bc = {True: "on", False: "off"}
# ...
bc = want_bc[c.page == "blog"]

Je préfère cette solution et/ou celle de l'indexation des tuple, dans la mesure où je préfère le calcul aux tests.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X