2012-03-18 75 views
15

假設我有以下文件結構:如何獲取特定Python模塊中的變量列表?

data.py

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

core.py

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

我需要在數據中定義的所有變量。 py文件。我怎樣才能做到這一點?我可以使用dir(),但它會返回模塊的所有屬性,包括__name__等等。

+0

爲什麼你需要這樣做? – 2012-03-18 16:10:22

+3

我認爲dir()正是我如何去做的;如果不是v.startswith('__')],就會跳過任何看起來像「不是變量」的東西:'print [v for v in dir(data)if' – mattbornski 2012-03-18 16:11:33

+4

[保持數據不在變量名稱中](http:// nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html)。 – 2012-03-18 16:11:42

回答

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

通常是這樣做的食譜,但它迴避了一個問題。

爲什麼?

+3

爲什麼不呢?因爲顯式比隱式更好? – 2013-07-18 09:54:31

+5

爲什麼 - 例如一個模塊包含變量中的錯誤代碼(設想一個包圍C枚舉的python包裝器),將所有值和錯誤名稱添加到字典中以便進行有用的錯誤報告。 – danio 2013-09-20 13:27:05

+3

將測試數據放入一個單獨的模塊,並將它們全部導入,以便用夾具進行自動化測試。因此,對於要測試的新數據集,只需將其放入該模塊中,測試框架就會自動將其提取出來。 – kissgyorgy 2013-10-12 06:43:30

-1

嘗試:

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

當我測試它時不起作用。我認爲你打算做'dir(data)',即使那樣它仍然不起作用 – 2012-03-18 16:12:11

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) 

示例配置

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

結果函數

/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 

享受,兄弟。 :)