Biorąc pod uwagę ten fragment kodu:
from os import walk
files = []
for (dirpath, _, filenames) in walk(mydir):
# more code that modifies files
if len(files) == 0: # <-- C1801
return None
Pylint zaniepokoił mnie tą wiadomością dotyczącą wiersza z instrukcją if:
[pylint] C1801: Nie należy używać
len(SEQUENCE)
jako wartości warunku
Zasada C1801 na pierwszy rzut oka nie brzmiała dla mnie zbyt rozsądnie, a definicja w podręczniku nie wyjaśnia, dlaczego jest to problem. W rzeczywistości wręcz nazywa to niewłaściwym użyciem .
len-as-condition (C1801) : Nie należy używać
len(SEQUENCE)
jako wartości warunku Używane, gdy Pylint wykryje nieprawidłowe użycie len (sekwencji) w warunkach wewnętrznych.
Moje próby wyszukiwania również nie dały mi głębszego wyjaśnienia. Rozumiem, że właściwość długości sekwencji może być leniwie oceniana i __len__
może być zaprogramowana tak, aby wywoływała skutki uboczne, ale wątpliwe jest, czy sama ta jest wystarczająco problematyczna, aby Pylint mógł nazwać takie użycie niepoprawnym. Dlatego zanim skonfiguruję mój projekt tak, aby ignorował regułę, chciałbym wiedzieć, czy coś mi brakuje w moim rozumowaniu.
Kiedy użycie len(SEQ)
jako warunku jest problematyczne? Jakie główne sytuacje próbuje uniknąć Pylint z C1801?
len
nie zna kontekstu, w którym jest wywoływany, więc jeśli obliczenie długości oznacza przejście całej sekwencji, musi; nie wie, że wynik jest właśnie porównywany z 0. Obliczenie wartości logicznej może zostać zatrzymane po zobaczeniu pierwszego elementu, niezależnie od tego, jak długo faktycznie trwa sekwencja. Myślę jednak, że pylint jest tu nieco opiniotwórczy; Nie mogę wymyślić żadnej sytuacji, w której użycie byłoby niewłaściwelen
, tylko że jest to gorsza opcja niż alternatywa.
if files:
lubif not files: