2012-03-18 8 views
15

Supponiamo che io ho la seguente struttura di file:Come ottenere un elenco di variabili in un modulo Python specifico?

data.py

foo = [] 
bar = [] 
abc = "def" 

core.py

import data 
# do something here # 
# a = ... 
print a 
# ['foo', 'bar', 'abc'] 

ho bisogno di ottenere tutte le variabili definite nei dati. file py. Come posso ottenerlo? Potrei usare dir(), ma restituisce tutti gli attributi del modulo incluso __name__ e così via.

+0

Perché hai bisogno di fare questo? –

+3

Penso che dir() sia esattamente come lo farei; salta qualsiasi cosa che assomigli a "non una variabile": 'stampa [v per v in dir (data) se non v.startswith ('__')]' – mattbornski

+4

[Mantieni i dati fuori dai nomi delle variabili] (http: // nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html). –

risposta

19
print [item for item in dir(adfix) if not item.startswith("__")] 

è di solito la ricetta per fare questo, ma si pone la domanda.

Perché?

+3

E perché no? Perché l'esplicito è meglio di implicito? –

+5

Perché, ad es. un modulo contiene codici di errore in variabili (immagina un wrapper python attorno a C enum), aggiungendo tutti i valori e i nomi di errore a un dict per la segnalazione degli errori. – danio

+3

Inserire i dati di test in un modulo separato e importarli tutti per il test automatizzato con fixture. Quindi per un nuovo set di dati da testare, basta inserirlo in quel modulo e il framework di test lo rileverà automaticamente. – kissgyorgy

-1

Prova:

for vars in dir(): 
if vars.startswith("var"): 
    print vars 
+0

Non funziona quando l'ho provato. Penso che tu intendessi fare 'dir (data)', anche allora non funziona ancora –

4
#!/usr/local/bin/python 
# coding: utf-8 
__author__ = 'spouk' 

def get_book_variable_module_name(module_name): 
    module = globals().get(module_name, None) 
    book = {} 
    if module: 
     book = {key: value for key, value in module.__dict__.iteritems() if not (key.startswith('__') or key.startswith('_'))} 
    return book 

import config 

book = get_book_variable_module_name('config') 
for key, value in book.iteritems(): 
    print "{:<30}{:<100}".format(key, value) 

esempio config

#!/usr/local/bin/python 
# coding: utf-8 
__author__ = 'spouk' 

import os 

_basedir = os.path.abspath(os.path.dirname(__file__)) 

# database section MYSQL section 
DBHOST = 'localhost' 
DBNAME = 'simple_domain' 
DBPORT = 3306 
DBUSER = 'root' 
DBPASS = 'root' 

# global section 
DEBUG = True 
HOSTNAME = 'simpledomain.com' 
HOST = '0.0.0.0' 
PORT = 3000 
ADMINS = frozenset(['[email protected]']) 
SECRET_KEY = 'dfg45DFcx4rty' 
CSRF_ENABLED = True 
CSRF_SESSION_KEY = "simplekey" 

Funzione Risultato

/usr/local/bin/python2 /home/spouk/develop/python/2015/utils_2015/parse_config_py.py 
DBPORT      3306                         
os       <module 'os' from '/usr/local/lib/python2.7/os.pyc'>             
DBHOST      localhost                       
HOSTNAME      simpledomain.com                      
HOST       0.0.0.0                        
DBPASS      root                         
PORT       3000                         
ADMINS      frozenset(['[email protected]'])                  
CSRF_SESSION_KEY    simplekey                       
DEBUG       1                         
DBUSER      root                         
SECRET_KEY     dfg45DFcx4rty                      
CSRF_ENABLED     1                         
DBNAME      simple_domain                      

Process finished with exit code 0 

Godetevi, amico. :)

Problemi correlati