Warum gibt len ​​(None) 0 zurück?

7

None in Python ist ein Objekt.

%Vor%

Und als solche kann es Funktionen wie __str __ ()

verwenden %Vor%

Aber warum macht es nicht dasselbe für __len __ ()?

%Vor%

Es scheint, als wäre Pythonic genau so, wie if list auch dann akzeptabel ist, wenn die Variable None ist und nicht nur eine leere Liste.

Gibt es Fälle, die die Verwendung von len(None) eher zu einem Problem machen würden?

    
SuperBiasedMan 15.05.2015, 10:34
quelle

2 Antworten

8

Sie erwähnen, dass Sie das wollen:

  

, weil es oft als Fehler angezeigt wird, wenn eine Funktion None anstelle einer Liste zurückgibt

Vermutlich haben Sie einen Code wie:

%Vor%

und bekommen:

%Vor%

Beachten Sie Folgendes:

  • len dient zur Bestimmung der Länge von Sammlungen (zB a list , dict oder str - das sind Sized Objekte). Es ist nicht , um beliebige Objekte in Ganzzahlen umzuwandeln - es ist auch nicht implementiert für int oder bool , zum Beispiel;
  • Wenn None eine Möglichkeit ist, sollten Sie if list_probably is not None explizit testen. Verwenden von z.B. if list_probably würde None und die leere Liste [] gleich behandeln, was wahrscheinlich nicht das richtige Verhalten ist. und
  • Es gibt normalerweise eine bessere Möglichkeit, mit Listen umzugehen, die range(len(...)) - z. for item in list_probably , mit zip , etc.

Die Implementierung von len für None würde nur Fehler ausblenden wo None falsch behandelt wird, wie bei einem anderen Objekt - pro das Zen von Python ( import this ):

  

Fehler sollten niemals stillschweigend passieren.

Auf ähnliche Weise würde for item in None fehlschlagen, aber das bedeutet nicht, dass die Implementierung von None.__iter__ eine gute Idee ist! Fehler sind eine gute Sache - sie helfen Ihnen, die Probleme in Ihren Programmen schnell zu finden.

    
jonrsharpe 15.05.2015, 10:51
quelle
14

len ist nur für Sammlungen von Objekten sinnvoll - None ist keine Sammlung.

    
orlp 15.05.2015 10:36
quelle

Tags und Links