Question

En C #, je pourrais facilement écrire ce qui suit:

string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;

Existe-t-il un moyen rapide de faire la même chose en Python ou suis-je coincé avec une instruction 'if'?

Était-ce utile?

La solution

Dans Python 2.5, il y a

A if C else B

qui se comporte beaucoup comme?: en C. Cependant, il est mal vu pour deux raisons: la lisibilité et le fait qu’il existe généralement une méthode plus simple pour aborder le problème. Par exemple, dans votre cas:

stringValue = otherString or defaultString

Autres conseils

@Dan

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString
     

Ce type de code est plus long et plus expressif, mais également plus lisible

Eh bien oui, c'est plus long. Pas sûr de savoir plus & # 8220; plus expressif & # 8221; et & # 8220; plus lisible & # 8221 ;. À tout le moins, votre réclamation est discutable. J'irais même jusqu'à dire que c'est carrément faux, pour deux raisons.

Tout d’abord, votre code met l’accent sur la prise de décision (plutôt extrêmement). D'autre part, l'opérateur conditionnel met l'accent sur autre chose, à savoir la valeur (resp. L'affectation de cette valeur). Et c’est exactement ce que veut le rédacteur de ce code. La prise de décision est vraiment un sous-produit du code. La partie importante ici est l'opération d'affectation. Votre code masque cette affectation dans de nombreux bruits syntaxiques: le branchement.

Votre code est moins expressif car il déplace l'accent mis sur la partie importante.

Même dans ce cas, votre code l'emporterait probablement sur un art ASCII obscur tel que ?: . Un inline- si serait préférable. Personnellement, je n'aime pas la variante introduite avec Python 2.5 car elle est inversée. Je préférerais quelque chose qui se lit dans le même flux (direction) que l'opérateur ternaire C mais utilise des mots plutôt que des caractères ASCII:

C = if cond then A else B

Ceci gagne haut la main.

C et C # n'ont malheureusement pas de déclaration aussi expressive. Mais (et c'est le deuxième argument), l'opérateur conditionnel ternaire des langages C est si établi depuis longtemps qu'il est devenu un idiome en soi. L’opérateur ternaire fait autant partie de la langue que le & 8282; classique & # 8221; si . Parce que c'est un idiome, quiconque connaît la langue lit immédiatement ce code correctement. De plus, c'est une manière extrêmement courte et concise d'exprimer ces sémantiques. En fait, c'est le moyen le plus court imaginable. C’est extrêmement expressif car il ne cache pas l’essence avec un bruit inutile.

Enfin, Jeff Atwood a bien résumé la conclusion: Le meilleur code n'existe aucun code .

Écrire un code expressif lisible n’est jamais une mauvaise chose.

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

Ce type de code est plus long et plus expressif, mais il est également plus lisible et moins susceptible de trébucher ou d’être mal édité plus tard. N'ayez pas peur d'écrire de manière explicite: un code lisible devrait être un objectif et non un sous-produit.

Il y a quelques doublons de cette question, par exemple.

En substance, dans un paramètre général, le code pré-2.5 devrait utiliser ceci:

 (condExp and [thenExp] or [elseExp])[0]

(étant donné condExp, thenExp et elseExp sont des expressions arbitraires), car cela évite des résultats erronés si thenExp est évalué à boolean False, tout en maintenant l'évaluation des courts-circuits.

Au fait, j0rd4n, vous n’écrivez pas ( s'il vous plaît !) un code comme celui-ci en C #. Mis à part le fait que IsDefaultOrNull est en réalité appelé IsNullOrEmpty , il s'agit d'un code pur. C # offre l’opérateur de fusion pour des situations comme celles-ci:

string stringValue = otherString ?? defaultString;

Il est vrai que cela ne fonctionne que si otherString est null (plutôt que vide), mais si cela peut être garanti à l'avance (et cela peut souvent être le cas), le code sera beaucoup plus lisible.

J'ai également découvert que le simple fait d'utiliser le "ou le" l'opérateur fait assez bien. Par exemple:

finalString = get_override() or defaultString

Si get_override () retourne """ ou None, il utilisera toujours defaultString .

Le chapitre 4 de diveintopython.net a la réponse. C'est ce qu'on appelle l'astuce en Python.

Vous pouvez tirer parti du fait que les expressions logiques renvoient leur valeur et pas uniquement le statut vrai ou faux. Par exemple, vous pouvez toujours utiliser:

result = question and firstanswer or secondanswer

Avec l'avertissement qu'il ne fonctionne pas comme l'opérateur ternaire si firstanswer est false. Cela est dû au fait que question est évaluée en premier, en supposant que sa première réponse soit renvoyée, sauf si cette réponse est fausse. Par conséquent, cette utilisation ne fonctionne pas comme l'opérateur ternaire. Si vous connaissez les valeurs, cependant, il n'y a généralement pas de problème. Un exemple serait:

result = choice == 7 and "Seven" or "Another Choice"

Si vous utilisiez ruby, vous pourriez écrire

stringValue = otherString.blank? ? defaultString : otherString;

la méthode vierge? intégrée signifie null ou vide.
Viens du côté obscur ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top