นี่เป็นอีกทางเลือกหนึ่งที่ไม่มีปัญหาคำหลักที่กล่าวถึงในคำตอบของ Dunes สามารถจัดการ{0}
อาร์กิวเมนต์positional ( ) เท่านั้นและไม่ใช่อาร์กิวเมนต์ keyword ( {foo}
) นอกจากนี้ยังไม่ต้องใช้การเรียกสองครั้งในการจัดรูปแบบ (โดยใช้เครื่องหมายขีดล่าง) มันมีปัจจัย ick ของคลาสย่อย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คุณสามารถใช้พารามิเตอร์ styleกับ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)