यहां एक और विकल्प दिया गया है जिसमें ड्यून्स के उत्तर में वर्णित कीवर्ड समस्याएं नहीं हैं। यह केवल स्थितिगत ( {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
नए शैली के स्वरूपण का उपयोग करने के लिए एडेप्टर के माध्यम से सभी संदेशों को बाध्य करने के लिए नोट किए गए चेक को हटा सकते हैं ।
इस उत्तर को वर्षों बाद पढ़ने वाले किसी भी व्यक्ति के लिए ध्यान दें : पायथन 3.2 के साथ , आप ऑब्जेक्ट के साथ शैली पैरामीटर का उपयोग कर सकते हैंFormatter
:
लॉगिंग (3.2 के रूप में) इन दो अतिरिक्त स्वरूपण शैलियों के लिए बेहतर समर्थन प्रदान करता है। नाम के अतिरिक्त, वैकल्पिक कीवर्ड पैरामीटर लेने के लिए फॉर्मेटर क्लास को बढ़ाया गया है 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)