พิจารณาตัวอย่างโค้ดนี้:
from os import walk
files = []
for (dirpath, _, filenames) in walk(mydir):
# more code that modifies files
if len(files) == 0: # <-- C1801
return None
ฉันตื่นตระหนกโดย Pylint กับข้อความนี้เกี่ยวกับบรรทัดที่มีคำสั่ง if:
[pylint] C1801: อย่าใช้
len(SEQUENCE)
เป็นค่าเงื่อนไข
กฎ C1801 ในแวบแรกไม่ฟังดูสมเหตุสมผลสำหรับฉันและคำจำกัดความของคู่มืออ้างอิงไม่ได้อธิบายว่าทำไมถึงเป็นปัญหา ในความเป็นจริงมันอย่างจริงจังเรียกมันใช้ไม่ถูกต้อง
len-as-condition (C1801) : ห้ามใช้
len(SEQUENCE)
เป็นค่าเงื่อนไขใช้เมื่อ Pylint ตรวจพบการใช้ len (ลำดับ) ที่ไม่ถูกต้องภายในเงื่อนไข
ความพยายามในการค้นหาของฉันก็ล้มเหลวเช่นกัน ฉันเข้าใจว่าคุณสมบัติความยาวของลำดับอาจได้รับการประเมินอย่างเกียจคร้านและ__len__
สามารถตั้งโปรแกรมให้มีผลข้างเคียงได้ แต่ก็เป็นที่น่าสงสัยว่าเพียงอย่างเดียวนั้นเป็นปัญหาเพียงพอหรือไม่ที่ Pylint จะเรียกการใช้ดังกล่าวไม่ถูกต้อง ดังนั้นก่อนที่ฉันจะกำหนดค่าโครงการของฉันให้เพิกเฉยต่อกฎฉันอยากจะรู้ว่าฉันคิดถึงบางสิ่งบางอย่างในเหตุผลของฉันหรือไม่
การใช้len(SEQ)
เป็นค่าเงื่อนไขเป็นปัญหาเมื่อใด สถานการณ์ใดที่สำคัญที่ Pylint พยายามหลีกเลี่ยงด้วย C1801?
len
ไม่ทราบบริบทที่มีการเรียกใช้ดังนั้นหากการคำนวณความยาวหมายถึงการข้ามลำดับทั้งหมดต้อง; ไม่ทราบว่าผลลัพธ์นั้นเพิ่งถูกเปรียบเทียบกับ 0 การคำนวณค่าบูลีนสามารถหยุดได้หลังจากที่เห็นองค์ประกอบแรกโดยไม่คำนึงว่าลำดับนั้นยาวแค่ไหน ฉันคิดว่าไพลินกำลังถูกดื้อดึงที่นี่แม้ว่า; ฉันไม่สามารถนึกถึงสถานการณ์ใด ๆ ที่มันผิดที่จะใช้len
เพียงว่ามันเป็นตัวเลือกที่เลวร้ายยิ่งกว่าทางเลือก
if files:
หรือif not files: