def func1():
if my_api_success():
return my_api_value
else
return None
x= 1 if func1() is None else func1()
I want to capture the return value of func1().
Is it possible to write an one line code, with out calling func1() twice?
3 Réponses :
Si vous utilisez Python 3.8, vous pouvez utiliser une expression d'affectation:
x = next(1 if value is None else value for value in (func1(),))
Si vous utilisez une version antérieure de Python, vous pouvez utiliser le code next > fonction avec une expression de générateur qui itère sur un 1-tuple de func1 () pour obtenir le même effet d'une expression d'affectation:
x = 1 if (value := func1()) is None else value
La meilleure façon de faire serait de suivre ce que @CharlieWindolf a suggéré d'utiliser:
x = 1 if (y := func1()) is None else y
Le problème avec ceci est que cela nécessite func1 () code> pour renvoyer une valeur que python traite comme un booléen.
Pour résoudre ce problème, vous devez utiliser deux lignes.
y = func1() x = 1 if y is None else y
Dans Python3.8, cela peut être possible en utilisant un expression d'affectation mais je ne l'ai pas encore testé.
x = func1() or 1
Pourquoi ne pas simplement renvoyer la valeur pour laquelle vous essayez de vérifier la condition dans le cas de Aucune.
ou vous pouvez simplement:
X = func1 ()
si X est nul X = 1
Il l'appelle définitivement deux fois. Il y en a cependant. Vous pouvez faire
x = func1 () ou 1.pourquoi ne pas utiliser simplement deux lignes? Je ne vois aucune bonne raison. Python 3.8 aura des expressions d'affectation, ce qui permettra cela. Utilisez donc Python 3.8 ou utilisez simplement deux lignes. Même si vous utilisez Python 3.8, vous ne devriez probablement utiliser que deux lignes.
@CharlieWindolf: Seulement si toutes les valeurs possibles de
my_api_valuesont véridiques.ouserait faux sifunc1 ()pouvait renvoyer0ou d'autres valeurs fausses.C'est un bon point. Donc, oui, probablement deux lignes sont meilleures.
func1doit déclencher une exception en cas d'échec, sans renvoyerNone.