Đây là một tùy chọn khác không có các vấn đề về từ khóa được đề cập trong câu trả lời của Dunes. Nó chỉ có thể xử lý các {0}
đối số positional ( ) chứ không phải đối số keyword ( {foo}
). Nó cũng không yêu cầu hai lệnh gọi để định dạng (sử dụng dấu gạch dưới). Nó có hệ số ick của phân lớp 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
Bạn sử dụng nó như thế này:
logger = StyleAdapter(logging.getLogger(__name__))
logger.info("knights:{0}", "ni", style="{")
logger.info("knights:{}", "shrubbery", style="{")
Tất nhiên, bạn có thể xóa dấu kiểm được ghi chú # optional
để buộc tất cả các thư thông qua bộ điều hợp sử dụng định dạng kiểu mới.
Lưu ý cho bất kỳ ai đọc câu trả lời này nhiều năm sau : Bắt đầu với Python 3.2 , bạn có thể sử dụng tham số kiểu với Formatter
các đối tượng:
Ghi nhật ký (kể từ 3.2) cung cấp hỗ trợ được cải thiện cho hai kiểu định dạng bổ sung này. Lớp Formatter được nâng cao để có thêm một tham số từ khóa tùy chọn được đặt tên style
. Giá trị này mặc định là '%'
, nhưng các giá trị có thể có khác là '{'
và '$'
, tương ứng với hai kiểu định dạng khác. Tính tương thích ngược được duy trì theo mặc định (như bạn mong đợi), nhưng bằng cách chỉ định rõ ràng một tham số kiểu, bạn có khả năng chỉ định các chuỗi định dạng hoạt động với str.format()
hoặc
string.Template
.
Tài liệu cung cấp ví dụ
logging.Formatter('{asctime} {name} {levelname:8s} {message}', style='{')
Lưu ý rằng trong trường hợp này, bạn vẫn không thể gọi logger
với định dạng mới. Tức là, những điều sau vẫn sẽ không hoạt động:
logger.info("knights:{say}", say="ni")
logger.info("knights:{0}", "ni")
log.debug("format this message%d" % 1)