Dunes의 답변에 언급 된 키워드 문제가없는 또 다른 옵션이 있습니다. {0}
키워드 ( {foo}
) 인수가 아닌 위치 ( ) 인수 만 처리 할 수 있습니다 . 또한 형식을 지정하기 위해 두 번의 호출이 필요하지 않습니다 (밑줄 사용). 하위 클래스의 ick-factor가 있습니다 str
.
class BraceString(str):
def __mod__(self, other):
return self.format(*other)
def __str__(self):
return self
class StyleAdapter(logging.LoggerAdapter):
def __init__(self, logger, extra=None):
super(StyleAdapter, self).__init__(logger, extra)
def process(self, msg, kwargs):
if kwargs.pop('style', "%") == "{":
msg = BraceString(msg)
return msg, kwargs
다음과 같이 사용합니다.
logger = StyleAdapter(logging.getLogger(__name__))
logger.info("knights:{0}", "ni", style="{")
logger.info("knights:{}", "shrubbery", style="{")
물론 # optional
어댑터를 통한 모든 메시지가 새 스타일 형식을 사용하도록 강제하기 위해 표시된 확인을 제거 할 수 있습니다 .
몇 년 후이 답변을 읽는 모든 사람을위한 참고 사항 : Python 3.2 부터는 객체 와 함께 스타일 매개 변수 를 사용할 수 있습니다Formatter
.
로깅 (3.2부터)은 이러한 두 가지 추가 서식 스타일에 대한 향상된 지원을 제공합니다. Formatter 클래스는라는 추가 선택적 키워드 매개 변수를 사용하도록 향상되었습니다 style
. 기본값은 '%'
이지만 다른 가능한 값은 다른 두 서식 스타일에 해당하는 '{'
및 '$'
입니다. 이전 버전과의 호환성은 기본적으로 유지되지만 (예상대로) 명시 적으로 스타일 매개 변수를 지정하면 str.format()
또는에서
작동하는 형식 문자열을 지정할 수 string.Template
있습니다.
문서는 예제를 제공합니다.
logging.Formatter('{asctime} {name} {levelname:8s} {message}', style='{')
이 경우에도 logger
새 형식으로를 호출 할 수 없습니다 . 즉, 다음은 여전히 작동하지 않습니다.
logger.info("knights:{say}", say="ni")
logger.info("knights:{0}", "ni")
log.debug("format this message%d" % 1)