2015-05-15 18 views
7

None in Python è un oggetto.Perché len (Nessuno) non restituisce 0?

>>> isinstance(None, object) 
True 

E, come tale, può utilizzare funzioni come __str __()

>>> str(None) 
'None' 

Ma perché non fa fare la stessa cosa per __len __()?

>>> len(None) 
Traceback (most recent call last): 
    File "<pyshell#3>", line 1, in <module> 
    len(None) 
TypeError: object of type 'NoneType' has no len() 

sembra che sarebbe Pythonic stesso modo che if list è accettabile anche se la variabile è None e non solo un elenco vuoto.

Esistono casi che potrebbero rendere l'uso di len(None) un problema?

+11

Perché 'None' non ha un' __len__'; non è ['Dimensiona'] (https://docs.python.org/2/library/collections.html#collections.Sized). – jonrsharpe

+0

@jonrsharpe Ma potrebbe avere solo una funzione aggiunta che restituisce 0 non importa cosa. – SuperBiasedMan

+0

potrebbe ma non avrebbe molto senso. Perché un oggetto dovrebbe avere una lunghezza a meno che non si tratti di una collezione di oggetti? –

risposta

8

si parla che si desidera che questo:

perché si esce spesso un errore quando una funzione restituisce None invece di una lista

Presumibilmente, si dispone di un codice simile:

list_probably = some_function() 
for index in range(len(list_probably)): 
    ... 

e stanno ottenendo:

TypeError: object of type 'NoneType' has no len() 

Nota seguente:

  • len è per determinare la lunghezza di collezioni (ad esempio a list, dict o str - questi sono oggetti Sized). È non per convertire oggetti arbitrari in numeri interi, ma non è implementato per int o bool, ad esempio;
  • Se None è una possibilità, è necessario testare in modo esplicito if list_probably is not None. Usando per es. if list_probably trattano lo None e l'elenco vuoto [] lo stesso, che probabilmente non è il comportamento corretto; e
  • Di solito c'è un modo migliore per gestire gli elenchi che range(len(...)) - ad es. for item in list_probably, utilizzando zip, ecc

Implementazione len per None sarebbe solo nascondere errori dove None viene trattato, in modo non corretto, come qualche altro oggetto - per the Zen of Python (import this):

errori devono non passare mai in silenzio

Allo stesso modo for item in None fallirebbe, ma questo non significa che l'attuazione None.__iter__ è una buona idea!Gli errori sono una buona cosa: ti aiutano a trovare rapidamente i problemi nei tuoi programmi.

14

len ha senso solo per le raccolte di oggetti - Nessuna non è una raccolta.

+0

Ha forse meno senso dire che potrebbe sempre restituire 0 rispetto alla verità (o alla falsità) di "Nessuno"? – SuperBiasedMan

+0

@SuperBiasedMan Sì, ha meno senso. Chiediti, è la lunghezza del colore rosso 0? – orlp

+1

@SuperBiasedMan si! Anche un numero intero non ha una lunghezza, ma ha la verità: vedi https://docs.python.org/2/library/stdtypes.html#truth-value-testing. Si noti inoltre che si dovrebbe testare generalmente "Nessuno" per * identità * piuttosto che * verità *. – jonrsharpe

Problemi correlati