如何获取特定Python模块中的变量列表?

aem*_*mdy 25 python

我们假设我有以下文件结构:

data.py

foo = []
bar = []
abc = "def"
Run Code Online (Sandbox Code Playgroud)

core.py

import data
# do something here #
# a = ...
print a
# ['foo', 'bar', 'abc']
Run Code Online (Sandbox Code Playgroud)

我需要获取data.py文件中定义的所有变量.我怎样才能做到这一点?我可以使用dir(),但它返回模块的所有属性,包括__name__等等.

Jak*_*yer 37

print [item for item in dir(adfix) if not item.startswith("__")]
Run Code Online (Sandbox Code Playgroud)

通常是这样做的秘诀,但它引出了一个问题.

为什么?

  • 为什么 - 例如一个模块包含变量中的错误代码(想象一个围绕C枚举的python包装器),将所有值和错误名称添加到dict以获得有用的错误报告. (7认同)
  • 那么为何不?因为显性比隐含更好吗? (4认同)
  • **这样做有明显正当理由,**尤其是在外国控制下处理第三方API时.Numpy是这里的典型例子.`numpy.distutils .__ config__` API仅提供机器生成的字典全局变量而不是人类可用的callables.如何查询这个可恶的API?当然,`dir()`,`hasattr()`和`getattr()`.每当问题的悖论受到质疑时,我就会睁大眼睛.在普通情况下被认为是有害的非Pythonic解决方案可能被证明是边缘情况下的唯一解决方案._欢迎来到真实的世界._ (4认同)
  • 将测试数据放入单独的模块并将其全部导入以使用夹具进行自动测试.因此,对于要测试的新数据集,您只需将其放入该模块中,测试框架将自动获取它. (3认同)

Spo*_*ouk 8

#!/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)
Run Code Online (Sandbox Code Playgroud)

示例配置

#!/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(['admin@localhost'])
SECRET_KEY = 'dfg45DFcx4rty'
CSRF_ENABLED = True
CSRF_SESSION_KEY = "simplekey"
Run Code Online (Sandbox Code Playgroud)

结果函数

/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(['admin@localhost'])                                                                      
CSRF_SESSION_KEY              simplekey                                                                                           
DEBUG                         1                                                                                                   
DBUSER                        root                                                                                                
SECRET_KEY                    dfg45DFcx4rty                                                                                       
CSRF_ENABLED                  1                                                                                                   
DBNAME                        simple_domain                                                                                       

Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)

享受,伙计.:)

  • 巧妙的解决方案!在 Python 3 中,使用 `.items()` 而不是 `.iteritems()` (4认同)