Dlaczego użycie len (sekwencji) w wartościach warunkowych jest uważane za nieprawidłowe przez Pylint?

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

Zaalarmował mnie Pylint tą wiadomością dotyczącą linii ze stwierdzeniem if:

[pylint] C1801: nie używaj len(SEQUENCE) jako wartości warunkowej

Zasada C1801 na pierwszy rzut oka nie brzmiała dla mnie zbyt rozsądnie, a definicja w przewodniku referencyjnym nie wyjaśnia, dlaczego jest to problem. W rzeczywistości, to wręcz nazywa to nieprawidłowe użycie.

Len-as-condition (C1801) : nie używaj len(SEQUENCE) jako wartości warunkowej używanej, gdy Pylint wykryje nieprawidłowe użycie len (sekwencji) wewnątrz warunków.

Moje poszukiwania również nie dostarczyły mi głębszego wyjaśnienia. Rozumiem, że właściwość długości sekwencji może być leniwie oceniana i że __len__ może być zaprogramowana tak, aby wywoływała skutki uboczne, ale wątpliwe jest, czy samo to jest wystarczająco problematyczne, aby Pylint nazwał takie użycie niepoprawnym. Stąd, zanim po prostu skonfiguruj mój projekt, aby ignorował regułę, chciałbym wiedzieć, czy czegoś mi brakuje w moim rozumowaniu.

Kiedy użycie len(SEQ) jako wartości warunkowej jest problematyczne? Jakich poważnych sytuacji Pylint próbuje uniknąć przy użyciu C1801?

Author: E_net4, 2017-03-30

2 answers

Kiedy użycie len(SEQ) jako wartości warunkowej jest problematyczne? Jaki major czy Pylint próbuje uniknąć sytuacji z C1801?

To nie jest naprawdę problematyczne w użyciu len(SEQUENCE) – choć może nie być tak skuteczne (zobacz komentarz chepnera ). Niezależnie od tego, Pylint sprawdza kod pod kątem zgodności z PEP 8 style guide, który stwierdza, że

Dla sekwencji (ciągów, list, krotek), użyj faktu, że puste sekwencje są fałsz.

Yes: if not seq:
     if seq:

No:  if len(seq):
     if not len(seq):

Jako okazjonalny programista Pythona, który porusza się między językami, uznałbym konstrukcję len(SEQUENCE) za bardziej czytelną i wyraźną ("Explicit is better then implicit"). Jednak użycie faktu, że pusta Sekwencja ewaluuje do False w kontekście logicznym jest uważane za bardziej "Pythoniczne".

 159
Author: Anthony Geoghegan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-18 15:49:48

Zauważ, że użycie len (seq) jest w rzeczywistości wymagane (zamiast sprawdzania wartości bool SEQ) podczas używania tablic NumPy.

a = numpy.array(range(10))
if a:
    print "a is not empty"

Powoduje wyjątek: ValueError: wartość prawdy tablicy zawierającej więcej niż jeden element jest niejednoznaczna. Użyj a. any () lub A.all ()

I dlatego w przypadku kodu używającego zarówno list Pythona, jak i tablic NumPy, komunikat C1801 jest mniej niż pomocny.

 24
Author: Cameron Hayne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-08 20:46:20