تسمية قطع الاشجار بيثون
سؤال
في جانغو، لقد حصلت على قطع الاشجار في كل مكان، وحاليا مع أسماء الثابت تلوينها.
لتسجيل مستوى الوحدة النمطية (أي في وحدة نمطية من وظائف رأي) لدي الرغبة للقيام بذلك.
log = logging.getLogger(__name__)
لتسجيل على مستوى فئة (أي، في أسلوب فئة __init__
) لدي الرغبة للقيام بذلك.
self.log = logging.getLogger("%s.%s" % (
self.__module__, self.__class__.__name__))
وأنا أبحث عن الآراء الثانية قبل أن معالجة عشرات الحوادث من getLogger("hard.coded.name")
.
وسيكون هذا العمل؟ أي شخص آخر تسمية قطع الاشجار مع الطرق ضعيف الخيال نفسها؟
وعلاوة على ذلك، يجب أن يتكسر وإرسال الديكور فئة لهذا التعريف سجل؟
المحلول
وأنا عادة لا تستخدم أو العثور على الحاجة لقطع الاشجار على مستوى الدرجة، ولكن أظل وحدات بلدي في فئات قليلة على الأكثر. بسيطة:
import logging
LOG = logging.getLogger(__name__)
في الجزء العلوي من وحدة واللاحقة:
LOG.info('Spam and eggs are tasty!')
ومن أي مكان في الملف يحصل عادة لي إلى حيث أريد أن أكون. هذا يتجنب الحاجة إلى self.log
في كل مكان، والتي تميل إلى يزعجني سواء من منظور وضع، فإنه في وكل الطبقة ويجعلني 5 شخصيات أقرب إلى خطوط 79 الحرف الذي يصلح.
هل يمكن دائما استخدام الزائفة الطبقة الديكور:
>>> import logging
>>> class Foo(object):
... def __init__(self):
... self.log.info('Meh')
...
>>> def logged_class(cls):
... cls.log = logging.getLogger('{0}.{1}'.format(__name__, cls.__name__))
...
>>> logged_class(Foo)
>>> logging.basicConfig(level=logging.DEBUG)
>>> f = Foo()
INFO:__main__.Foo:Meh
نصائح أخرى
لتسجيل مستوى الفئة، كبديل للالديكور من الدرجة الزائفة، هل يمكن استخدام metaclass لجعل مسجل لأنك في وقت إنشاء الفئة ...
import logging
class Foo(object):
class __metaclass__(type):
def __init__(cls, name, bases, attrs):
type.__init__(name, bases, attrs)
cls.log = logging.getLogger('%s.%s' % (attrs['__module__'], name))
def __init__(self):
self.log.info('here I am, a %s!' % type(self).__name__)
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
foo = Foo()
وهذا يبدو أنه سوف يعمل، إلا أن ذلك لم يكن لديك self
سمة __module__
. سوف فئتها. الدعوة المسجل على مستوى الطبقة يجب أن تبدو مثل:
self.log = logging.getLogger( "%s.%s" % ( self.__class__.__module__, self.__class__.__name__ ) )