0

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

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

-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(name) 处遇到错误,即“未定义调试”,但我正试图让这个概念发挥作用。

我发现的一种方法是将 main.py 更改为:

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

然后一切正常,但我不确定我是否喜欢它......任何想法或轶事将不胜感激。

4

4 回答 4

2

使用inspect模块

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))))

选择

主要.py:

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

我的模块.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))
于 2013-10-12T20:55:20.200 回答
1
members = dir(module)
for item in members:
   if not eval('hasattr(module.%s, "__call__")' % item):
      print item, eval("module.%s" % item)

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

于 2013-10-12T20:57:59.240 回答
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))
于 2013-10-12T21:12:27.927 回答
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)))
于 2013-10-16T17:55:12.703 回答