2009-05-24 4 views
1

정적 정보를 '모듈'에서 다른 모듈로 가져와야합니다. 로깅중인 코드 위치 정보를 로거에 쓰려고합니다. 일부 파일의 예를 들어 :Python - 정적 정보 얻기

LogObject.Log('Describe error', STATIC_INFORMATION) 

정적 정보는 클래스 이름, 파일 이름 및 함수 이름입니다. 나는이에서 그것을 얻을 :

__file__ 
self.__class__.__name__ 
sys._getframe().f_code.co_name 

하지만 난 로깅하는 동안이 변수를 쓰고 싶지 않습니다. 몇 가지 함수를 만들고 호출 할 수 있습니까? 예 :

LogObject.Log('Describe error', someFunction()) 

어떻게 정적 정보를 가져올 수 있습니까?

답변

3

나는 "정적"이 당신이 찾고있는 세상이라고 생각하지 않습니다. 올바르게 이해한다면 호출자의 파일 이름, 클래스 이름 및 메서드 이름을 반환하는 함수를 작성하려고합니다.

기본적으로 sys._getframe (1)을 사용하여 이전 프레임에 액세스하고 거기에서 작업해야합니다.

예 :

def codeinfo(): 
    import sys 
    f = sys._getframe(1) 

    filename = f.f_code.co_filename 
    classname = '' 

    if 'self' in f.f_locals: 
     classname = f.f_locals['self'].__class__.__name__ 

    funcname = f.f_code.co_name 

    return "filename: %s\nclass: %s\nfunc: %s" % (filename, classname, funcname) 

는 그런 방법에서 어딘가에 당신이 답장을 보내

logger.info("Some message \n %s" % codeinfo()) 
+0

감사합니다.하지만 함수 이름은 어떻게됩니까? – Ockonal

+0

추가됨. 하지만 이것은 좋은 코드는 아닙니다. 나는 시간이있을 때 그것을 깨끗하게하려고 노력할 것이다. – itsadok

+0

어디서나 고마워, 코드가 잘 작동합니다. – Ockonal

2

먼저 개체 및 방법에 소문자를 사용하십시오. 클래스 정의에는 대문자 이름 만 사용하십시오.

더 중요한 것은 모든 클래스에서 영리한 내성적 인 기능을 원한다는 것입니다.

class Loggable(object): 
    def identification(self): 
     return self.__class__.__module__, self.__class__.__name__, sys._getframe().f_code.co_name 

class ARealClass(Loggable): 
    def someFunction(self): 
     logger.info("Some Message from %r", self. identification()) 

수업의 모든 Loggable의 서브 클래스 인 경우

, 당신은 모든 클래스에서이 식별 기능을 상속 할 수 있습니다.

+0

감사를 작성할 수 있습니다. > 모든 클래스가 Loggable의 서브 클래스 인 경우. 아니요, 그렇지 않습니다. Loggable 클래스를 다른 모듈 (파일)에 만들면 반환하는 데이터가 필요하지 않게됩니다. 아니면 이해 못 했어? – Ockonal

+0

시도해 보셨습니까? 각 클래스가 Loggable의 하위 클래스이면 각 클래스는 클래스의 각 객체에 대해 적절한 값을 생성합니다. 그것은 여러 파일에서 작동합니다. 시도 해봐. –

+0

올바른 __module__을 사용하는 것을 수정했습니다. –