2011-09-22 5 views
7

Voilà ma situation:Python comment vérifier si la variable existe et sa longueur, dans une instruction if?

if var: 
    if len(var) == 5: 
     do something... 
else: 
    do the same thing... 

Pour éviter de répéter le même morceau de code, je voudrais combiner ces 2 si les conditions, en un. Mais si var est None, je ne peux pas vérifier sa longueur ... Une idée? Je voudrais quelque chose comme ceci:

if var and len(var) == 5: 
    do something... 
+4

Ce que vous avez suggéré est bien. 'si var et len ​​(var) == 5' fonctionnera –

+0

En plus de ce que tout le monde a déjà dit (c'est-à-dire que votre suggestion fonctionne vraiment comme prévu) pourquoi vérifiez-vous la longueur si vous allez faire la même chose? Notez également qu'en général lorsque vous avez un corps de code que vous ne voulez pas répéter, l'outil à utiliser est une fonction ou une méthode (en fonction de la quantité de contexte requise par le code). – 6502

+0

Je ne devrais pas poser de questions la nuit, dans l'espoir d'obtenir une réponse le matin ... J'étais sûr d'avoir essayé ça et ça n'a pas marché ... – Tickon

Répondre

14

Avez-vous essayé cela? Il fonctionne:

if var and len(var) == 5: 
    .... 

L'opérateur and n'évalue pas l'ERS si le LHS est faux. Essayez ceci:

>>> False and 1/0 
False 
>>> True and 1/0 
ZeroDivisionError: division by zero 
+0

si var n'existe pas, il veut faire quelque chose comme et bien non? – steabert

+2

@steabert: Ajoutez 'not' ou' else' à votre code comme bon vous semble. Je ne suis pas ici pour écrire votre code, juste pour répondre aux questions. –

+0

Il y a un problème ici (qui pourrait ou non être pertinent pour @Tickon): Cette solution ne fait pas de distinction entre les cas 'var == []' et 'var est None'.Dans le premier cas, 'len (var)' peut être déterminé ('== 0'), dans le dernier cas il ne peut pas. (Cependant, je ne pense pas que ce soit une raison de baisser cette réponse) –

3

Le code que vous avez écrit dans la question exécute les instructions dans deux cas:

  • var true et évalue a une longueur de 5
  • var est évaluée à faux (par exemple, il est None ou False)

Vous pouvez combiner les en un seul conditionnel comme suit:

if not var or len(var) == 5: 
    ... 

La condition que certaines autres réponses suggèrent, var and len(var) == 5, n'évalue à True dans le premier cas, pas la seconde. Je dirai, cependant, que les deux cas que vous avez choisis sont une combinaison inhabituelle. Êtes-vous sûr de ne pas avoir l'intention d'exécuter les instructions uniquement si la variable a une valeur non-fausse et a une longueur de 5?

En outre, comme 6502 a écrit dans un commentaire, les fonctions sont prévues pour exactement ce cas, à savoir la fabrication de blocs de code réutilisables. Donc, une autre solution facile serait

def f(): 
    .... 
if var: 
    if var.length == 5: 
     f() 
else: 
    f() 
0

Eh bien, les exceptions semblent être parfaitement bien ici.

try: 
    if len(var) == 5: 
     do_something() 
except TypeError: 
    pass 

Vous dites que var peut être nulle, donc une exception TypeError serait levée. Si, cependant, en fait var peut être inexistant du tout, vous devriez attraper pour NameError exception.

+0

C'est la solution qui fait exactement ce que demande @Tickon. Seulement si 'var est None' (ou un autre type non-indicable, mais cela n'a pas été demandé ici), l'exception sera déclenchée. Et c'est plus Pythonic pour ce que ça vaut. –

Questions connexes