我的应用程序中有很多常量变量。在这个应用程序中我导入一个模块。作为测试的一部分,我想从所述导入模块中的函数调用,该函数打印出变量的名称及其值。
好的,所以这不是我的代码,但这显示了我想要做的概念:
-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'])
然后事情有效,但我不确定我喜欢它......任何想法或轶事都会受到赞赏。
答案 0 :(得分:2)
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)))