เหตุใดตัวอย่างนี้จึงล้มเหลวด้วย `` AttributeError: วัตถุ 'CustomAdapter' ไม่มีแอตทริบิวต์ 'setLevel'``

ฉันใส่สิ่งต่อไปนี้ลงในไฟล์ชื่อ repro.py จากนั้นพิมพ์ python repro.py (ฉันใช้ C Python 2.7.5) มันล้มเหลวโดยมีข้อผิดพลาดในคำถาม แหล่งที่มายืนยันว่าไม่มีวิธีการของชื่อนั้นในคลาส LoggerAdapter ยกเว้นเอกสาร (http://docs.python.org/2/library/logging.html#logging.LoggerAdapter) บอกว่ามี:

นอกเหนือจากที่กล่าวมาข้างต้น LoggerAdapter ยังรองรับวิธีการต่อไปนี้ของ Logger เช่น debug(), info(), warning(), error(), ข้อยกเว้น(),critical(), log(), isEnabledFor(), getEffectiveLevel() , setLevel(), hasHandlers() วิธีการเหล่านี้มีลายเซ็นเหมือนกับลายเซ็นใน Logger ดังนั้นคุณจึงใช้อินสแตนซ์ทั้งสองประเภทสลับกันได้

นี่เป็นข้อผิดพลาดหรือฉันเข้าใจอะไรผิดหรือเปล่า? หากเป็นอย่างหลัง เป็นไปได้ไหมที่จะใช้อินสแตนซ์ LoggerAdapter แทนอินสแตนซ์ Logger แบบดรอปอิน

import logging logging.basicConfig ()

class CustomAdapter(logging.LoggerAdapter):
    def process(self, msg, kwargs):
        return '[%s] %s' % (self.extra['connid'], msg), kwargs

logger = logging.getLogger(__name__) 
adapter = CustomAdapter(logger, {'connid': '1234'}) 
adapter.setLevel (logging.WARN) 
adapter.warning ("Ahoy matey")

person offby1    schedule 30.10.2013    source แหล่งที่มา
comment
นี่จะไม่แก้ปัญหาคำถามของคุณ แต่ฉันเชื่อว่ามันเป็น logging.WARNING ไม่ใช่ logging.WARN ฉันลองใช้รหัสของคุณแล้วหากคุณลบฟังก์ชัน setLevel การเรียกใช้โค้ดของคุณใช้งานได้ (คุณอาจรู้เรื่องนี้แล้ว)   -  person jramirez    schedule 31.10.2013
comment
@jramirez ใช่ฉันรู้แล้วจริงๆ นั่นคือประเด็น   -  person offby1    schedule 31.10.2013
comment
ฉันเชื่อว่ามันเป็นข้อบกพร่อง ดังนั้นฉันจึงรายงานมันแล้ว: bugs.python.org/issue19455   -  person offby1    schedule 31.10.2013


คำตอบ (1)


คุณไม่เข้าใจผิด ฟังก์ชันการอ้างสิทธิ์เอกสารที่ไม่ได้รับการสนับสนุน คลาส LoggerAdapter สืบทอดมาจาก object แทนที่จะเป็นจาก Logger ดังนั้นจึงสนับสนุนเฉพาะวิธีการที่กำหนดไว้อย่างชัดเจนเท่านั้น อย่างไรก็ตาม จะจัดเก็บอินสแตนซ์ตัวบันทึกที่คุณส่งผ่านเป็น self.logger

ดังนั้น ในตอนนี้ คุณสามารถดำเนินการนี้แทนได้:

adapter.logger.setLevel(logging.WARN)

ฉันยอมรับว่านี่เป็นข้อผิดพลาดในเอกสารประกอบหรือข้อบกพร่องในการใช้งาน ขึ้นอยู่กับว่าคุณมองอย่างไร

person Markku K.    schedule 30.10.2013