2009-04-15 8 views
28

Esiste un modo per controllare se una variabile (membro della classe o indipendente) con nome specificato è definita? Esempio:Un modo semplice per verificare che una variabile sia definita in python?

if "myVar" in myObject.__dict__ : # not an easy way 
    print myObject.myVar 
else 
    print "not defined" 
+0

classe di terze parti, è necessario impostare un flag per il mio scopo privato, non voglio scherzare con la classe __init __() – grigoryvp

+0

Questo è davvero confuso. Perché scrivere un sacco di codice per determinare quali variabili vengono utilizzate? Basta creare un'istanza, stampare istanza .__ dict __. Keys() o fare dir (istanza) e si conoscono tutti i nomi degli attributi. –

+0

Temo di essere anche confuso. La domanda si pone sia sui membri della classe che su quelli autonomi. Ovviamente, non esiste __init__ per vars indipendenti di livello superiore; quale miasma di terze parti è costruito così male che così tante sue variabili, a più livelli di visibilità, sono a rischio di essere completamente inesistenti? –

risposta

27

Un modo compatto: modo

print myObject.myVar if hasattr(myObject, 'myVar') else 'not defined' 

di htw è più Pythonic, però.

hasattr() è diverso da x in y.__dict__, però: hasattr() prende attributi classe ereditata in considerazione, così come quelli dinamici restituiti dalla __getattr__, considerando y.__dict__ contiene solo quegli oggetti che sono attributi dell'istanza y.

+0

Penso che stia solo cercando hasattr(). – monkut

+0

Sì, molto probabilmente. E che dire di una variabile globale? (dichiarato nel modulo, non in uno spazio dei nomi di classe)? – grigoryvp

+0

@Eye of Hell: forse (x in globals()), ma la mia vera risposta sarebbe che il codice che deve fare questo è un-Pythonic e dovrebbe davvero inizializzare la variabile su None. – Miles

21
try: 
    print myObject.myVar 
except NameError: 
    print "not defined" 
+0

Almeno ottenere le variabili e l'output corretto :-) +1 – paxdiablo

+16

Se myObject è definito, ma non ha un 'myVar', si otterrà invece un AttributeError. –

9

Paolo ha ragione, ci può essere qualcosa fuori con il modo in cui si sta facendo le cose, se questo è necessario. Ma se stai facendo qualcosa di veloce e sporco probabilmente non ti interessa lo Idiomatic Python, allora questo potrebbe essere più breve.

try: x 
except: print "var doesn't exist" 
4

Leggi eo trucchi in pitone: 'a' a gente del posto() e un

+0

Errore se a è la stringa vuota o qualsiasi altro valore di falsy. –

4

Per verificare se la variabile, myvar, è definito:

result = dir().count('myvar') 

Se myvar è definito, risultato è 1, altrimenti sarebbe 0.

Questo funziona perfettamente in Python versione 3.1.2.

+0

Perché non solo ''myvar' in dir()', quindi? – rdb

Problemi correlati