0
votes

Référence première valeur dans l'opérateur ternaire

Très souvent, je me trouve écrire un opérateur ternaire équivalent à l'équivalent d'équivalent xxx

avec retournementbool retourner une valeur booléenne en fonction de la valeur de A < /code >.


A est une variable de longue durée Il commence à être laidly et "nonpythonic". Existe-t-il un moyen de référencer a dans la partie conditionnelle ( retournementbool (a) ) de l'instruction afin que vous n'ayez pas à écrire a deux fois?

ou y a-t-il une meilleure approche pour ce cas, qui est également utile pour les compréhensions de la liste?


8 commentaires

Si la conversion de Bool de A respecte la valeur "Truthy" ou "FALSY", vous pouvez simplement écrire var = a ou b . Si A est un type de classe, il suffit d'implémenter __ bool __ et vous pouvez le faire aussi.


Vous pouvez également stocker le résultat de votre variable longue de ... A


Qu'en est-il de def Boolordefault (A, B): retourner un if renversementbool (A) autre B ? Les fonctions sont là pour supprimer la duplication de code


Stockez l'expression A dans une variable d'abord.


Si la ligne devient trop longue, pourquoi ne pas aller avec un bloc classique si 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 .


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é si cela ne fait pas cela ne les utilise pas


3 Réponses :


1
votes

Tant que A ne peut pas être une valeur "FALSY", vous pouvez modifier votre retournementbool pour renvoyer A / Aucun au lieu de true / false .

alors vous pouvez écrire: xxx

sinon, définir votre propre ternaire semble être le meilleur pari: xxx

Et vous pouvez le personnaliser pour des conditions spécifiques à l'aide de partiel : xxx


0 commentaires

1
votes

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


1 commentaires

C'est probablement la solution la plus proche de ce que j'avais à l'esprit, merci.



0
votes

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


0 commentaires