2012-03-18 20 views
15

Giả sử tôi có cấu trúc tập tin sau đây:Cách lấy danh sách các biến trong mô-đun Python cụ thể?

data.py

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

core.py

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

tôi cần để có được tất cả các biến được định nghĩa trong dữ liệu. tập tin py. Làm thế nào tôi có thể đạt được điều đó? Tôi có thể sử dụng dir(), nhưng nó trả về tất cả các thuộc tính của mô-đun bao gồm __name__ và vân vân.

+0

Tại sao bạn cần thực hiện việc này? –

+3

Tôi nghĩ rằng dir() là chính xác như thế nào tôi sẽ làm điều đó; chỉ bỏ qua bất kỳ thứ gì có dạng "không phải biến": 'in [v cho v trong dir (dữ liệu) nếu không v.startswith ('__')]' – mattbornski

+4

[Giữ dữ liệu ra khỏi tên biến của bạn] (http: // nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html). –

Trả lời

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

thường là các công thức để làm điều này, nhưng nó đặt ra câu hỏi.

Tại sao?

+3

Và tại sao không? Bởi vì rõ ràng là tốt hơn là ngầm? –

+5

Lý do - ví dụ: một mô-đun chứa mã lỗi trong các biến (tưởng tượng một trình bao bọc python vòng C enums), thêm tất cả các giá trị và tên lỗi vào một dict để báo cáo lỗi hữu ích. – danio

+3

Đưa dữ liệu thử nghiệm vào một mô-đun riêng biệt và nhập tất cả các mô-đun đó để thử nghiệm tự động với các đồ đạc. Vì vậy, để một tập dữ liệu mới để kiểm tra, bạn chỉ cần đặt nó trong mô-đun đó và khung kiểm tra sẽ tự động lấy nó. – kissgyorgy

-1

Hãy thử:

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

Không hoạt động khi tôi thử nghiệm nó. Tôi nghĩ rằng bạn có nghĩa là để làm 'dir (dữ liệu)', thậm chí sau đó nó vẫn không hoạt động –

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) 

dụ cấu hình

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

chức năng kết quả

/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 

Thưởng thức, dude. :)

Các vấn đề liên quan