এখানে আরেকটি বিকল্প রয়েছে যা ডুনসের উত্তরে উল্লিখিত মূল শব্দটির সমস্যা নেই। এটি কেবলমাত্র অবস্থানগত ( {0}
) আর্গুমেন্টগুলি পরিচালনা করতে পারে এবং কীওয়ার্ড ( {foo}
) যুক্তিগুলি নয়। এটি বিন্যাস করতে (আন্ডারস্কোর ব্যবহার করে) দুটি কলেরও প্রয়োজন হয় না। এটিতে সাবক্লাসিংয়ের আইক-ফ্যাক্টর রয়েছে 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
অ্যাডাপ্টারের মাধ্যমে সমস্ত বার্তাকে নতুন-স্টাইলের ফর্ম্যাটিং ব্যবহার করতে বাধ্য করার জন্য উল্লিখিত চেকটি সরাতে পারেন ।
এই উত্তরটি কয়েক বছর পরে পড়ার জন্য নোট করুন : পাইথন ৩.২ দিয়ে শুরু করে আপনি স্টাইলের প্যারামিটারগুলিFormatter
অবজেক্ট সহ ব্যবহার করতে পারেন :
লগিং (৩.২ হিসাবে) এই দুটি অতিরিক্ত বিন্যাস শৈলীর উন্নত সমর্থন সরবরাহ করে। নামের অতিরিক্ত, alচ্ছিক কীওয়ার্ড প্যারামিটার নিতে ফর্ম্যাটর ক্লাসটি বাড়ানো হয়েছে 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)