İşte Dunes'un cevabında bahsedilen anahtar kelime problemlerine sahip olmayan başka bir seçenek. Yalnızca konumsal ( {0}
) argümanları işleyebilir, keyword ( {foo}
) argümanlarını işleyemez . Ayrıca, biçimlendirmek için iki çağrı gerektirmez (alt çizgi kullanılarak). Alt sınıflandırma ick faktörüne sahiptir 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
Bunu şu şekilde kullanırsın:
logger = StyleAdapter(logging.getLogger(__name__))
logger.info("knights:{0}", "ni", style="{")
logger.info("knights:{}", "shrubbery", style="{")
Elbette # optional
, bağdaştırıcı aracılığıyla tüm iletileri yeni stil biçimlendirmeyi kullanmaya zorlamak için ile not edilen onay işaretini kaldırabilirsiniz .
Daha sonra bu cevabı yıllar okuyan herkes için Not : başlayarak Python 3.2 şunları yapabilirsiniz tarzı parametresini kullanın ile Formatter
nesneler:
Günlük kaydı (3.2'den itibaren), bu iki ek biçimlendirme stili için gelişmiş destek sağlar. Formatter sınıfı, adında ek, isteğe bağlı bir anahtar kelime parametresi alacak şekilde geliştirilmiştir style
. Bu varsayılan değerdir '%'
, ancak diğer olası değerler '{'
ve '$'
, diğer iki biçimlendirme stiline karşılık gelir. Geriye dönük uyumluluk varsayılan olarak korunur (beklediğiniz gibi), ancak bir stil parametresini açıkça belirterek, str.format()
veya
ile çalışan biçim dizelerini belirtme olanağına sahip olursunuz string.Template
.
Dokümanlar örnek sağlar
logging.Formatter('{asctime} {name} {levelname:8s} {message}', style='{')
Bu durumda logger
, yeni formatla hala arayamayacağınızı unutmayın . Yani, aşağıdakiler hala işe yaramayacak:
logger.info("knights:{say}", say="ni")
logger.info("knights:{0}", "ni")
log.debug("format this message%d" % 1)