在模块中打印变量值

时间:2013-10-12 20:43:56

标签: python

我的应用程序中有很多常量变量。在这个应用程序中我导入一个模块。作为测试的一部分,我想从所述导入模块中的函数调用,该函数打印出变量的名称及其值。

好的,所以这不是我的代码,但这显示了我想要做的概念:

-main.py-
import mymodule
DEBUG = True
BATCH = False
ShowVars(['DEBUG','BATCH'])

-mymodule.py-
def ShowVars(varlist):
  for name in varlist:
    print('{} -> {}').format(name,eval(name))

我在eval(名称)处发现错误,当然“我没有定义DEBUG”,但我试图让这个概念有效。

我找到的一种方法是将main.py更改为:

-main.py-
import mymodule
DEBUG = True
BATCH = False
mymodule.DEBUG=DEBUG
mymodule.BATCH=BATCH
ShowVars(['DEBUG','BATCH'])

然后事情有效,但我不确定我喜欢它......任何想法或轶事都会受到赞赏。

4 个答案:

答案 0 :(得分:2)

使用inspect module

import inspect

def ShowVars(varlist):
    frame = inspect.currentframe().f_back
    g = frame.f_globals
    l = frame.f_locals
    for name in varlist:
        print('{} -> {}'.format(name, l.get(name, g.get(name))))

<强> ALTERNATIVE

main.py:

import mymodule
DEBUG = True
BATCH = False
mymodule.ShowVars(DEBUG, BATCH)

mymodule.py:

import inspect

def ShowVars(*values):
    line = inspect.stack()[1][4][0]
    names = line.rsplit('(', 1)[-1].split(')', 1)[0] # Extract argument names.
    names = map(str.strip, names.split(','))
    for name, value in zip(names, values):
        print('{} -> {}'.format(name, value))

答案 1 :(得分:1)

members = dir(module)
for item in members:
   if not eval('hasattr(module.%s, "__call__")' % item):
      print item, eval("module.%s" % item)

应该给你第一次通过,但你可能希望过滤掉以_和其他项目开头的事情。

答案 2 :(得分:1)

导入内部功能并不漂亮,但它有效:

-main.py -

from mymodule import *
DEBUG = True
BATCH = False

if __name__ == '__main__':
  ShowVars(['DEBUG','BATCH'])

-mymodule.py -

def ShowVars(varlist):
  from main import *
  for name in varlist:
    print('{} -> {}').format(name,eval(name))

答案 3 :(得分:0)

感谢所有回答!你的洞察让我走了很长的路。我尝试使用所有技术,发现检查模块做了我需要的。但是当我努力将其实现到我们的真实代码中时,我发现我在帧堆栈中的位置将变得非常重要。我能够通过使用多个.f_backs来完成检查模块,但我最终选择了sys._getframe()因为你可以给它一个深度。所以我原来的mymodule.py改为:

-mymodule.py-
import sys
import traceback

def ShowVars(varlist):
  depth = len(traceback.extract_stack())-1
  f = sys._getframe(depth)
  for name in varlist:
    print('{} -> {}').format(name,f.f_locals.get(name,f.f_globals.get(name)))