Très souvent, je me trouve écrire un opérateur ternaire équivalent à l'équivalent d'équivalent avec ou y a-t-il une meilleure approche pour ce cas, qui est également utile pour les compréhensions de la liste? p> p> retournementbool code> retourner une valeur booléenne en fonction de la valeur de A < /code >.
A code> est une variable de longue durée Il commence à être laidly et "nonpythonic". Existe-t-il un moyen de référencer a code> dans la partie conditionnelle ( retournementbool (a) code>) de l'instruction afin que vous n'ayez pas à écrire a code> deux fois? p>
3 Réponses :
Tant que alors vous pouvez écrire: p> sinon, définir votre propre ternaire semble être le meilleur pari: p> Et vous pouvez le personnaliser pour des conditions spécifiques à l'aide de A code> ne peut pas être une valeur "FALSY", vous pouvez modifier votre retournementbool code> pour renvoyer A code> / Aucun code> au lieu de true code> / false code>. partiel code>: p>
Vous pouvez utiliser le : = code> "walrus" Opérateur d'affectation introduit dans Python 3.8: def returnsBool(a):
return bool(a)
reallylengthiervariablename = 42
b = 2
var = a if returnsBool(a := reallylengthiervariablename) else b
print(f'{var=}') # -> var=42
C'est probablement la solution la plus proche de ce que j'avais à l'esprit, merci.
Voici une manière non très idiomatique de le faire, mais cela fonctionne; La fonction suivante code> peut prendre un second argument renvoyé au cas où le premier argument est un itérateur vide. def if_else(predicate, a, b):
return a if predicate(a) else b
Si la conversion de Bool de
A code> respecte la valeur "Truthy" ou "FALSY", vous pouvez simplement écrirevar = a ou b code>. SiA code> est un type de classe, il suffit d'implémenter__ bool __ code> et vous pouvez le faire aussi.Vous pouvez également stocker le résultat de votre variable longue de ...
A code>Qu'en est-il de
def Boolordefault (A, B): retourner un if renversementbool (A) autre B code>? Les fonctions sont là pour supprimer la duplication de codeStockez l'expression
A code> dans une variable d'abord.Si la ligne devient trop longue, pourquoi ne pas aller avec un bloc classique
si code> bloque? Normalement, j'occupe Var à B et n'écrit que si si la condition est remplie. Enregistre une ligne :-)Mais vous ne pouvez pas simplement faire une mission de tout en construisant une liste avec une compréhension de la liste, sauf si je suis mal compris.
@Caramiriel c'est trop spécifique mais je suppose que je pouvais faire quelque chose comme
def ternarydependingonfunfunc (A, B, FUNC): renvoyer A si Func (a) autre B code>.Ensuite, juste sur cette logique dans une fonction et utilisez cette fonction dans la compréhension de la liste. L'ensemble des compréhensions de la liste et des expressions conditionnelles est de Améliorer la lisibilité i> si cela ne fait pas cela ne les utilise pas