ข้อความ PyLint: การบันทึกการจัดรูปแบบการแก้ไข


161

สำหรับรหัสต่อไปนี้:

logger.debug('message: {}'.format('test'))

pylint สร้างคำเตือนต่อไปนี้:

การบันทึก - รูปแบบ - การแก้ไข (W1202):

ใช้การจัดรูปแบบ% ในฟังก์ชั่นการบันทึกและส่งผ่านพารามิเตอร์% เป็นอาร์กิวเมนต์ที่ใช้เมื่อคำสั่งการบันทึกมีรูปแบบการโทรเป็น "การบันทึก (format_string.format (format_args ... ))" การเรียกดังกล่าวควรใช้การจัดรูปแบบ% แทน แต่ปล่อยให้การแก้ไขไปยังฟังก์ชันการบันทึกโดยส่งพารามิเตอร์เป็นอาร์กิวเมนต์

ฉันรู้ว่าฉันสามารถปิดคำเตือนนี้ได้ แต่ฉันต้องการที่จะเข้าใจ ฉันถือว่าการใช้format()เป็นวิธีที่เหมาะสมในการพิมพ์คำสั่งใน Python 3 ทำไมจึงไม่เป็นความจริงสำหรับคำสั่ง logger?

คำตอบ:


203

มันไม่เป็นความจริงสำหรับคำสั่ง logger เพราะอาศัยรูปแบบ "%" เดิมเช่นสตริงเพื่อให้การแก้ไขขี้เกียจของสายนี้โดยใช้อาร์กิวเมนต์พิเศษที่กำหนดให้กับการโทร logger ตัวอย่างเช่นแทนที่จะทำ:

logger.error('oops caused by %s' % exc)

คุณควรทำ

logger.error('oops caused by %s', exc)

ดังนั้นสตริงจะถูกแก้ไขหากข้อความถูกปล่อยออกมาจริงๆ

.format()คุณไม่สามารถได้รับประโยชน์ของการทำงานนี้เมื่อใช้


ตามส่วนการเพิ่มประสิทธิภาพของloggingเอกสาร:

การจัดรูปแบบของอาร์กิวเมนต์ของข้อความถูกเลื่อนออกไปจนกว่าจะไม่สามารถหลีกเลี่ยงได้ อย่างไรก็ตามการคำนวณข้อโต้แย้งที่ส่งไปยังวิธีการบันทึกอาจมีค่าใช้จ่ายสูงและคุณอาจต้องการหลีกเลี่ยงหากผู้บันทึกเพิ่งจะละทิ้งกิจกรรมของคุณ


4
@pfnuesel, .format () ถูกขยายก่อนที่จะเรียกไปยัง logger.error ในขณะที่ "การแก้ไขขี้เกียจ" หมายถึงการขยายจะกระทำเมื่อจำเป็นเท่านั้น (เช่นข้อความจะปรากฏที่ใดที่หนึ่งจริง ๆ )
8654

10
มีการอ้างอิงที่ดีสำหรับการประเมินแบบสันหลังยาวที่เป็นที่ต้องการและสร้างความแตกต่างหรือไม่? ฉันไม่พบหนึ่งในPEP282หรือไลบรารีการบันทึก
culix

25
แต่นี่หมายความว่าเราจะมีปัญหาในการบำรุงรักษาโค้ดของเราในภายหลังหรือไม่ ในภายหลังเราจะ "แนะนำ" โดย pylint เพื่อย้ายไปที่.format()สไตล์ในบางจุดเพราะloggingมีการอัพเกรดหรือไม่ ฉันถามเพราะฉันสนใจในการบำรุงรักษามากกว่าฉันในเรื่องความเร็วเลือดออกอย่างน้อยที่สุดสำหรับงานส่วนใหญ่
Mike Williamson

3
@ MikeWilliamson: ฉันคิดว่าข้อความนี้เป็นคำเตือนเพราะมีผลข้างเคียงที่เป็นไปได้ แต่คุณสามารถเพิกเฉยได้อย่างปลอดภัย
saihtamtellim

5
ในขณะที่แรงจูงใจส่วนใหญ่ที่อยู่เบื้องหลังคำเตือนนั้นเกี่ยวกับประสิทธิภาพ (เช่น: หากไม่มีการบันทึกคำสั่งบันทึกค่าใช้จ่ายในการแก้ไขจะถูกบันทึกไว้) แต่ก็คุ้มค่าที่จะสังเกตว่าในหลาย ๆ แอปพลิเคชั่น ดู: github.com/PyCQA/pylint/issues/2395และgithub.com/PyCQA/pylint/issues/2354
Adam Parkin

23

บางทีความแตกต่างในเวลานี้สามารถช่วยคุณได้

คำอธิบายต่อไปนี้ไม่ใช่คำตอบสำหรับคำถามของคุณ แต่สามารถช่วยผู้คนได้

สำหรับ pylint 2.4: มี 3 ตัวเลือกสำหรับการเข้าสู่ระบบในรูปแบบที่มี.pylintrcไฟล์: old, new,fstr

fstrตัวเลือกเพิ่มใน2.4และลบออกใน2.5

คำอธิบายจาก.pylintrcไฟล์ (v2.4):

[LOGGING]

# Format style used to check logging format string. `old` means using %
# formatting, `new` is for `{}` formatting,and `fstr` is for f-strings.
logging-format-style=old

สำหรับเก่า ( logging-format-style=old):

foo = "bar"
self.logger.info("foo: %s", foo)

สำหรับใหม่ ( logging-format-style=new):

foo = "bar"
self.logger.info("foo: {}", foo)
# OR
self.logger.info("foo: {foo}", foo=foo)

หมายเหตุ : คุณไม่สามารถใช้งาน.format()ได้แม้ว่าคุณจะเลือกnewตัวเลือก

ไพลินยังคงให้คำเตือนเดียวกันสำหรับรหัสนี้:

self.logger.info("foo: {}".format(foo))  # W1202
# OR
self.logger.info("foo: {foo}".format(foo=foo))  # W1202

สำหรับfstr ( logging-format-style=fstr):

foo = "bar"
self.logger.info(f"foo: {foo}")

ส่วนตัวผมชอบตัวเลือก fstr เพราะPEP-0498


2
คุณสามารถเพิ่ม"python.linting.pylintArgs": ["--logging-format-style=old"]ไฟล์ vscode / settings.json เอกสาร
mustafagok

2
ใน pylint 2.3.1: optparse.OptionValueError: option logging-format-style: invalid value: 'fstr', should be in ['old', 'new']อัปเกรดเป็น pylint ล่าสุด (2.4.4) แก้ไขสิ่งนี้
Florian Castellane

ฉันมีข้อผิดพลาดดังต่อไปนี้:Try installing a more recent version of python-pylint, and please open a bug report if the issue persists in t\ he latest release. Thanks!
alper

4

จากประสบการณ์ของฉันมีเหตุผลที่น่าสนใจมากกว่าการเพิ่มประสิทธิภาพ (สำหรับกรณีการใช้งานส่วนใหญ่) สำหรับการแก้ไขแบบสันหลังยาวนั่นคือมันเล่นได้ดีกับตัวรวบรวมบันทึกเช่น Sentry

พิจารณาข้อความบันทึก 'ผู้ใช้ที่เข้าสู่ระบบ' หากคุณสอดแทรกผู้ใช้ลงในสตริงรูปแบบคุณจะมีข้อความบันทึกที่แตกต่างกันมากเท่ากับที่มีผู้ใช้ หากคุณใช้การแก้ไขแบบขี้เกียจเช่นนี้ตัวรวบรวมบันทึกสามารถตีความสิ่งนี้ได้อย่างสมเหตุสมผลว่าเป็นข้อความบันทึกเดียวกันกับกลุ่มอินสแตนซ์ที่ต่างกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.