Kann jemand die Logik hinter der Ausgabe des folgenden Skripts erklären?
%Vor%Danke:)
Wenn Sie ein beliebiges Objekt mit genau None
in Python vergleichen wollen, müssen Sie folgendes verwenden:
Wie in diesem Fall kann jedes Objekt seinen Vergleichsoperator überschreiben, um nicht das zu tun, was Sie erwarten.
Warum ist dtype ('float64') gleichbedeutend mit None im Kontext von dtypes, wie dtypes gleich typestrings
sind? %Vor%Gleichheit ist keine Identität.
Warum dtype(None) == dtype('float64')
, viele Funktionen in numpy haben dtype=None
Schlüsselwortargumente. In den meisten Fällen bedeutet dies default dtype, das ist dtype(None)
. Ein Beispiel ist np.zeros
. Aber es gibt Ausnahmen, z.B. wenn der dtype aus den Argumenten abgeleitet werden kann, wie im Fall von np.arange(10)
, wo der Standard dtype vom Integer-Typ ist ( np.intp
denke ich).
Sieht wie ein unglücklicher Zufall aus: Jemand entschied, dass dtype(None)
"default" wäre, um zu floaten (obwohl dtype()
ein Fehler ist). Dann schrieb jemand anderes dtype.__eq__
so, dass es sein zweites Argument vor dem Vergleich in einen dtype konvertiert. Also dtype(float) == None
ist dtype(float) == dtype(None)
, was wahr ist.
Sie können einen Kommentar im Quellcode hier sehen: descriptor.c # L1217
- Erhalte typenum von einem Objekt - None geht zu NPY_DEFAULT_TYPE
Und natürlich ist NPY_DEFAULT_TYPE float (zumindest normalerweise).
Wie für den Operator __eq__
ist es hier: descriptor.c # L3317 . Es macht das, was ich skizziert habe:
Das ist also eine Umwandlung von was auch immer auf der rechten Seite von ==
zu einem dtype Objekt ist, über die vorher erwähnte Konverterfunktion, die None
in dtype(float)
umwandelt.
Bearbeiten: Ich fand das ziemlich interessant und es scheint wie ein Unfall, also habe ich einen Patch erstellt und den Betreuern übergeben: Ссылка .