2011-02-04 3 views
1

다음 코드를 자주 작성합니다.파이썬 3 : 로그 함수 서명 문제

print('object', 'moved', 'from =', object.location, 'dest =', new_location) 
print('object', 'created', 'at =', object.location, 'status =', status) 

등등.

이 모든 것을 함수 log로 바꿀 계획이었습니다.

def log(self, action, **details): 
    print('object', action, end = '') 
    for var, value in state.items(): 
     print(var, '=', value, end = '') 
    print() 

은 거의 두 가지 문제가 있습니다. 첫째, 출력 순서를 제어 할 수 없기 때문에 나에게 중요합니다. 물론 details은 사전 일 뿐이므로 매개 변수의 순서는 손실됩니다. 둘째, 키워드 키워드의 이름으로 from과 같은 언어 키워드를 사용할 수 없습니다.

불필요한 자세한 정보를 피할 수 있지만 이러한 문제가 발생하지 않는 솔루션이 있습니까?

log 기능을 사용하고자하는 이유는이 기능을 비활성화/활성화하거나 단일 위치에서 형식을 변경하고자 할 수 있기 때문입니다.

답변

4

logging 모듈에 대해 알고 계시겠습니까?

난 그냥 예비 성형 된 메시지를 사용에 필요한 비트를 대체 할 것입니다 : 당신이 그것을 할 필요했다면

movedmsg = "object moved from = {0} to = {1}" 
print(movedmsg.format(object.location, new_location)) 

: 당신은 문자열 형식의 새로운 스타일을 선호 할 수

movedmsg = "object moved from = %s to = %s" 
print(movedmsg % (object.location, new_location)) 

사전과 같은 구조를 사용하면 OrderedDict를 만들 수 있습니다. 그러나 그것은 좀 더 장황하다. 그리고 실제로 "한 가지 분명한 방법"이 아닙니다.

+0

로깅 모듈을 확인하는 것이 좋습니다. Vinay는 좋은 방법을 썼습니다.이 방법을 사용하면 훨씬 쉽게 접근 할 수 있습니다. http://docs.python.org/3.2/howto/logging.html – ncoghlan

0

내가 생각할 수있는 가장 깨끗한 해결책은 키/값 쌍의 튜플을 대신 전달하는 것입니다.

def log(action, *details): 
    print('object', action, end = '') 
    for var, value in details: 
     print(var, '=', value, end = '') 
    print() 

log("moved", ("from", obj.location), ("dest", new_location)) 

형식 문자열을 캡처하고 실제 로깅을 수행하는 다른 함수를 반환하는 함수를 작성할 수 있습니다. 단일 형식을 자주 사용하려는 경우 유용 할 수 있습니다.

def makelogger(*format): 
    def logger(action, *args): 
     print("object", action, format % args) 
    return logger 

logger = makelogger("from = %s dest = %s") 
logger("moved", obj.location, new_location) 

# do a one-off 
makelogger("from = %s dest = %s")("moved", obj.location, new_location) 

몇 가지 생각.