2014-02-10 3 views
0

필자는 필자가 필요에 따라 가져온 일부 지원 라이브러리에 일부 헬퍼 함수를 ​​추가했습니다. 일부 로깅과 문자열 생성을 단순화하기 위해 함수가 호출되는 범위에 대해 globals()에 액세스해야하는 몇 가지 함수가 있습니다. 그러한 함수 중 하나가 format_vars이며, globals() dict를 기본적으로 문자열 형식 메서드의 즉석 인수로 사용하려고 시도합니다.inspect를 사용하지 않고 모듈을 특정 범위로 가져 오기

def format_vars(s, vars=None): 
    """Use .format() on a string while providing a dictionary or globals() by default. 

     Big Fat Warning: globals() is global to module, not script""" 

    if not vars: 
     vars = globals() 

    return s.format(**vars) 

이 내가 불행하게도 함수에서 소스 코드를 생성 한 후이를 실행해야 함을 활용, 매우 유용합니다. 나는 함수 정의 밑의 모듈 코드에서 다음을 가지고있다.

내가 모듈을 포함해야이 기능을 사용하고자하는 스크립트에서
FORMAT_VARS_SOURCE = inspect.getsource(format_vars) 

한 다음 다음을 수행 :이 일을 더 적절한 방법이있는 경우

exec(supportlib.FORMAT_VARS_SOURCE) 

내 질문은?

+0

그래도 질문에 답할 수는 없지만 [logging] (http://docs.python.org/2/library/logging.html) 모듈은 최소한 로그의 범위를 필요로합니다. 메시지. – 2rs2ts

답변

1

항상 도우미가 즉각적인 호출 범위를 참조하게하려면 도우미에서 inspect.stack()[-1][0].f_globals을 호출하여 호출 범위에서 전역을 가져올 수 있어야합니다. 나는 당신의 제목이 "검사하지 않고"라는 것을 알고 있지만, 질문의 텍스트에서 "수입 범위에서 펑키 한 코드가 없다"는 것을 정말로 보입니다.

+0

나는 실제로 펑크를 줄이려고했다. – whardier

+0

조금 변경해야합니다. 스택 인덱스가 전역을 포함하는 개체와 올바르게 정렬되지 않았습니다. def format_globals () return s.format (** inspect.stack() [- 1] [0] .f_globals) – whardier

+0

내가 편집했습니다. 나는 그 문서들이 행동이 정직하다고 말한 것에서 벗어나고 있었다. –

관련 문제