2012-03-18 28 views
15

Farz edelim ben aşağıdaki dosya yapısına sahip:Belirli Python modülündeki değişkenlerin listesi nasıl alınır?

data.py

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

core.py

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

Ben verilerde tanımlanan tüm değişkenler almak gerekir. py dosyası. Bunu nasıl başarabilirim? dir() kullanabilirdim, ancak __name__ dahil modülün tüm özelliklerini döndürür ve böyle devam eder.

+0

Bunu neden yapmanız gerekiyor? –

+3

Sanırım dir() tam olarak böyle yapardım; sadece "değişken değil" gibi görünen herhangi bir şeyi atlayın: 'print [v in v (d için v() 'da değil (veri) v.startswith (' __ ')]' – mattbornski

+4

[Verilerinizi değişken adlarınızdan uzak tutun] (http: // nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html). –

cevap

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

genellikle bu iş için reçete mi ama soru yalvarır.

Neden?

+3

Ve neden olmasın? Çünkü açık, örtük olmaktan iyidir? –

+5

Neden - ör. Bir modül, değişken hata kodlarını (bir python sarmalayıcıyı C enum'lar) hayal edin, tüm değerleri ve hata adlarını kullanışlı hata raporlaması için bir dict'e ekler. – danio

+3

Test verilerini ayrı bir modüle koymak ve hepsini fikstürlerle otomatik test etmek için içe aktarın. Bu yüzden test edilecek yeni bir veri kümesi için, onu sadece bu modüle koydunuz ve test çerçevesi otomatik olarak alacak. – kissgyorgy

-1

Dene:

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

Test ettiğimde çalışmıyor. Demek istediğim, 'dir (data) 'yapmak, o zaman bile hala çalışmıyor –

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) 

örnek yapılandırma

#!/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" 

sonuç fonksiyonu

/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 

, abi keyfini çıkarın. :)

İlgili konular