Considerando questo frammento di codice:
from os import walk
files = []
for (dirpath, _, filenames) in walk(mydir):
# more code that modifies files
if len(files) == 0: # <-- C1801
return None
Sono stato allarmato da Pylint con questo messaggio per quanto riguarda la riga con l'istruzione if:
[pylint] C1801: non utilizzare
len(SEQUENCE)
come valore di condizione
La regola C1801, a prima vista, non mi sembrava molto ragionevole e la definizione sulla guida di riferimento non spiega perché questo sia un problema. In effetti, lo chiama decisamente un uso errato .
len-as-condition (C1801) : non utilizzare
len(SEQUENCE)
come valore condizione Utilizzato quando Pylint rileva un uso errato di len (sequenza) all'interno delle condizioni.
Anche i miei tentativi di ricerca non sono riusciti a fornirmi una spiegazione più approfondita. Comprendo che la proprietà della lunghezza di una sequenza può essere valutata pigramente e che __len__
può essere programmata per avere effetti collaterali, ma è discutibile se questo da solo sia abbastanza problematico per Pylint da chiamare un tale uso errato. Quindi, prima di configurare semplicemente il mio progetto per ignorare la regola, vorrei sapere se mi manca qualcosa nel mio ragionamento.
Quando l'uso di len(SEQ)
come condizione è problematico? Quali sono le principali situazioni che Pylint sta tentando di evitare con C1801?
len
non conosce il contesto in cui viene chiamato, quindi se calcolare la lunghezza significa attraversare l'intera sequenza, deve; non sa che il risultato è stato appena confrontato con 0. Il calcolo del valore booleano può arrestarsi dopo aver visto il primo elemento, indipendentemente dalla durata effettiva della sequenza. Penso che il pilastro sia un po 'supponente qui; Non riesco a pensare a nessuna situazione in cui è sbagliato usare len
, solo che è un'opzione peggiore rispetto all'alternativa.
if files:
oif not files: