2010-02-20 5 views
2

Supposons que vous ayez une application avec une variable dont vous allez créer une instance lorsque vous la chargez indépendamment (c'est-à-dire lorsque vous utilisez if __name__ == '__main__').Comment tester si une variable a été initialisée avant de l'utiliser?

De plus, il existe une méthode qui doit être appelée lorsqu'un client importe l'application pour l'utiliser dans une autre application. Cette méthode va également instancier cette variable. Ce que je veux faire est de tester si la variable a déjà été instanciée avant de la définir (ainsi je n'ai pas besoin de passer par la création de l'objet deux fois). Mon intuition me dit d'utiliser if SOME_VARIABLE is not None: #instantiate here mais cela donne l'erreur

variable locale 'une_variable' référencé avant l'affectation

Qu'est-ce qui se passe?

Répondre

11

Il y a une erreur d'accéder à une variable avant d'être initialisé. La valeur d'une variable non initialisée n'est pas None; y accéder ne fait que lever une exception.

Vous pouvez attraper l'exception si vous aimez:

>>> try: 
... foo = x 
... except NameError: 
... x = 5 
... foo = 1 

Dans une classe, vous pouvez fournir une valeur par défaut de None et vérifiez que pour voir si elle a changé sur une instance particulière (en supposant que Aucun n'est pas une valeur valide pour cette variable particulière):

class Foo(object): 
    bar = None 
    def foo(self): 
     if self.bar is None: 
      self.bar = 5 
     return self.bar 
3

Vous pouvez if 'varname' in locals() (vous avez probablement aussi de vérifier globals(), et peut-être quelques autres endroits), ou tout simplement lire la variable et attrapez l'exception NameError qui sera jeté quand il n'existe pas.

Mais si vous voulez juste l'autre cas de if __name__ == '__main__', pourquoi ne pas simplement faire:

if __name__ == '__main__' 
    myvar = 'as_main' 
else: 
    myvar = 'as_import' 
Questions connexes