Xem xét đoạn mã này:
from os import walk
files = []
for (dirpath, _, filenames) in walk(mydir):
# more code that modifies files
if len(files) == 0: # <-- C1801
return None
Tôi đã bị báo động bởi Pylint với thông báo này liên quan đến dòng với câu lệnh if:
[pylint] C1801: Không sử dụng
len(SEQUENCE)
làm giá trị điều kiện
Quy tắc C1801, thoạt nhìn, nghe có vẻ không hợp lý lắm và định nghĩa trên hướng dẫn tham khảo không giải thích được tại sao đây là vấn đề. Trong thực tế, nó hoàn toàn gọi nó là sử dụng không chính xác .
len-as-condition (C1801) : Không sử dụng
len(SEQUENCE)
làm giá trị điều kiện Được sử dụng khi Pylint phát hiện việc sử dụng len (chuỗi) không chính xác trong các điều kiện.
Những nỗ lực tìm kiếm của tôi cũng đã thất bại trong việc cung cấp cho tôi một lời giải thích sâu sắc hơn. Tôi hiểu rằng thuộc tính độ dài của chuỗi có thể được đánh giá một cách lười biếng và __len__
có thể được lập trình để có tác dụng phụ, nhưng có một câu hỏi đặt ra là liệu một mình có đủ vấn đề để Pylint gọi việc sử dụng đó không chính xác hay không. Do đó, trước khi tôi đơn giản cấu hình dự án của mình để bỏ qua quy tắc, tôi muốn biết liệu tôi có thiếu điều gì trong lý luận của mình không.
Khi nào việc sử dụng len(SEQ)
như là một giá trị điều kiện có vấn đề? Những tình huống chính nào mà Pylint đang cố gắng tránh với C1801?
len
không biết bối cảnh mà nó được gọi, vì vậy nếu tính toán độ dài có nghĩa là đi qua toàn bộ chuỗi, thì nó phải; nó không biết rằng kết quả chỉ được so sánh với 0. Việc tính toán giá trị boolean có thể dừng lại sau khi nó nhìn thấy phần tử đầu tiên, bất kể chuỗi thực sự dài bao nhiêu. Tôi nghĩ rằng pylint đang được một chút ý kiến ở đây, mặc dù; Tôi không thể nghĩ về bất kỳ tình huống sử dụng sailen
, chỉ là đó là một lựa chọn tồi tệ hơn so với giải pháp thay thế.
if files:
hoặcif not files: