2013-10-12 3 views
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)) 

내가 평가 (이름)에서 오류 얻을 물론 'DEBUG가 정의되지 않은'것을을 그러나 나는이 개념을 작동 시키려고 노력하고있다. 내가 찾은

한 가지 방법으로 main.py 변경하는 것입니다 :

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

가 그런 사물이 작동하지만 난 어떤 아이디어 나 일화 주시면 감사하겠습니다 ... 나는 그것을 좋아하지 모르겠어요.

답변

0

감사합니다! 당신의 통찰력은 나를 길게 만들었습니다. 나는 모든 기술을 사용하여 시험해 보았고 inspect 모듈이 내가 필요로하는 것을 찾았다. 그러나 실제 코드로 구현할 때 프레임 스택에있는 부분이 중요 할 것이라고 생각했습니다. 여러 번 .f_backs을 사용하여 inspect 모듈을 통해이를 수행 할 수 있었지만 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))) 
+0

왜'traceback.extract_stack()'을 사용합니까? 'sys._getframe (1)'또는'inspect.currentframe(). f_back'만큼 충분하지 않습니까? – falsetru

+0

스택의 깊이를 알려주는 데 사용합니다. 이 예제에서는 깊이가 1이므로 (sys._getframe (1) 또는 inspect이므로) 작동합니다.currentframe(). f_back)으로 충분하다. 그러나 이것은 실제 적용에서 항상 전화의 깊이를 알 수는 없습니다. –

+0

그것은 이해가되지 않습니다. http://ideone.com/DcDF2J – falsetru

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

대안

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

인쇄 ('{} -> {}'형식 (이름, i.currentframe() f_back.f_locals.get (이름, i.currentframe() .f_back.f_globals.get (name)))) –

+0

@ pn1dude, 다른 해결책을 추가했습니다. 확인 해봐. – falsetru

+0

나는 이것을 시도하고 나의 출력은 'DEBUG'-> DEBUG 'BATCH'-> BATCH –

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

첫 번째 패스를 제공해야하지만 _ 및 기타 항목으로 시작하는 항목을 필터링 할 수 있습니다. 함수 내에서

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