web-dev-qa-db-fra.com

Une ligne si-condition-affectation

J'ai le code suivant

num1 = 10
someBoolValue = True

Je dois définir la valeur de num1 sur 20 si someBoolValue est True; et ne rien faire autrement. Alors, voici mon code pour ça

num1 = 20 if someBoolValue else num1

Y a-t-il un moyen d'éviter la partie ...else num1 pour la rendre plus propre? Un équivalent à 

if someBoolValue:
    num1 = 20

J'ai essayé de le remplacer par ...else pass comme ceci: num1=20 if someBoolValue else pass. Tout ce que j'ai obtenu était une erreur de syntaxe. Je ne pouvais pas non plus omettre la partie ...else num1.

83
bdhar

Je ne pense pas que cela soit possible en Python, car ce que vous essayez réellement de faire est probablement étendu à quelque chose comme ceci:

num1 = 20 if someBoolValue else num1

Si vous excluez else num1, vous recevrez une erreur de syntaxe car je suis à peu près sûr que l'affectation doit en réalité renvoyer quelque chose.

Comme d'autres l'ont déjà mentionné, vous pouvez le faire, mais c'est mauvais, car vous risquez probablement de vous perdre lorsque vous lirez ce code la prochaine fois:

if someBoolValue: num1=20

Je ne suis pas un grand fan du num1 = someBoolValue and 20 or num1 pour la même raison. Je dois en fait réfléchir à deux fois sur ce que fait cette ligne.

Le meilleur moyen de réaliser ce que vous voulez faire est la version originale:

if someBoolValue:
    num1 = 20

La meilleure raison en est que ce que vous voulez faire est très clair et vous ne risquez pas de vous embrouiller, ou de quiconque viendra plus tard en contact avec ce code.

De plus, num1 = 20 if someBoolValue est un code Ruby valide, car Ruby fonctionne un peu différemment.

133
Frost

Utilisez ceci:

num1 = 20 if someBoolValue else num1
30
gigimon

En une ligne:

if someBoolValue: num1 = 20

Mais ne fais pas ça. Ce style n'est normalement pas attendu. Les gens préfèrent la forme longue pour plus de clarté et de cohérence.

if someBoolValue:
    num1 = 20

(De même, les chapeaux de chameau doivent être évités. Utilisez plutôt some_bool_value.)

Notez qu'une expression some_value if predicate sans une partie else n'existe pas car il n'y aurait pas de valeur de retour si le prédicat était faux. Cependant, les expressions doivent avoir une valeur de retour clairement définie dans tous les cas. Ceci est différent de l’utilisation telle que Ruby ou Perl, par exemple.

18
Debilski

vous pouvez utiliser l'un des éléments suivants:

(falseVal, trueVal)[TEST]

TEST and trueVal or falseVal
11
kerwal

Non. Je suppose que vous espériez que quelque chose comme num1 = 20 if someBoolValue fonctionnerait, mais cela ne fonctionne pas. Je pense que le meilleur moyen est d'utiliser l'énoncé if tel que vous l'avez écrit:

if someBoolValue:
    num1 = 20
5
Mark Byers
num1 = 10 + 10*(someBoolValue == True)

C'est ma nouvelle réponse finale… .. La réponse précédente était la suivante et était excessive pour le problème énoncé. Getting_too_clever == not Good. Voici la réponse précédente ... toujours valable si vous voulez ajouter une chose pour True cond et une autre pour False:

num1 = 10 + (0,10)[someBoolValue == True]

Vous avez mentionné que num1 aurait déjà une valeur qui devrait être laissée seule. J'ai supposé que num1 = 10 étant la première déclaration de la publication, l'opération pour se rendre à 20 consiste à ajouter 10.

num1 = 10
someBoolValue = True

num1 = 10 + (0,10)[someBoolValue == True]

print(f'num1 = {num1}\nsomeBoolValue = {someBoolValue}')

produit cette sortie

num1 = 20
someBoolValue = True
3
MikeyB
num1 = 20 * someBoolValue or num1
1
kerwal

Si vous souhaitez invoquer une méthode si une valeur booléenne est vraie, vous pouvez mettre else None pour terminer le trinaire.

>>> a=1
>>> print(a) if a==1 else None
1
>>> print(a) if a==2 else None
>>> a=2
>>> print(a) if a==2 else None
2
>>> print(a) if a==1 else None
>>>
0
soultech67

Une autre façon num1 = (20*boolVar)+(num1*(not boolVar))

0
Rody From Argentina

Voici ce que je peux suggérer . Utilisez une autre variable pour dériver la clause if et affectez-la à num1.

Code:

num2 =20 if someBoolValue else num1
num1=num2
0
j raj

Vous pouvez certainement utiliser num1 = (20 si someBoolValue sinon num1) si vous le souhaitez.

0
Yaonan Qian