Seite 1 von 1

Interpreter Meldung NotImplemented

Verfasst: Mittwoch 21. Februar 2007, 09:56
von Helex
Hio,

ich bin neu in Python und probiere gerade einige Sachen im Interpreter, jedoch kann ich mit folgender Meldung nichts anfangen:

Code: Alles auswählen

>>> i = 1
>>> i
1
>>> i.__add__(2.0)
NotImplemented
>>>
Die Methode add erwartet also Objekte vom gleichen Datentyp, soweit so klar. Aber was sagt mir dieses NotImplemented?

Gibt es eine Möglichkeit, dass zu implementieren?

Vielen dank für die Antwort(en)

MfG
Helex

Verfasst: Mittwoch 21. Februar 2007, 10:01
von rayo
Hi

Du willst da eine Integerzahl (i) mit einer Floatzahl (2.0) zusammenzählen, nur weiss die Integerzahl nicht wie.

Die Floatzahl wüsste jedoch wie.

Code: Alles auswählen

2.0.__add__(i)
Aber wieso verwendest du die __add__-Methode? Kannst doch einfach i + 2.0 machen.

Gruss

Verfasst: Mittwoch 21. Februar 2007, 10:04
von Helex
@ rayo,

das hab ich auch sofort ausprobiert, nur hab ich gelesen, dass Objekte, auf die die der Plusoperator angewendet werden kann auch die Mthode add besitzen.

Ich will eigentlich nur wissen was dieses NotImplemented bedeutet.

Verfasst: Mittwoch 21. Februar 2007, 10:10
von rayo
Dass bei Integerzahlen dass addieren von Floatzahlen nicht implementiert ist.

Wenn es nicht implementiert ist ruft Python automatisch von der Floatzahl die __radd__ Methode auf. Aber halt nur wenn man das + und nicht direkt die __add__-Methode verwendet.


Gruss

Verfasst: Mittwoch 21. Februar 2007, 10:12
von Helex
Okay Frage beantwortet, danke!

Verfasst: Mittwoch 21. Februar 2007, 10:22
von mkesper
Interessant:

Code: Alles auswählen

>>> i=1
>>> type(i)
<type 'int'>
>>> i += 2.5
>>> type(i)
<type 'float'>
Ich hätte erwartet, daß i ein Integer bleibt.

Verfasst: Mittwoch 21. Februar 2007, 10:33
von Helex
@ mkalias

wenn man dein Experiment umgedreht macht, bleibt ein Float ein float, auch wenn man normal ein Integer addiert..

Code: Alles auswählen

>>> a = 2.0
>>> a
2.0
>>> a = a + 1
>>> a
3.0
>>> int(a)   # Casting float nach int
3

Verfasst: Mittwoch 21. Februar 2007, 10:36
von rayo
Hi

Integers sind unveränderbare Objekte, dass heisst, wenn sich der Wert ändert muss ein neues Objekt erstellt werden und i ist nacher an das neue Objekt gebunden.

Bei i += 2.5 passiert etwa folgendes:

Code: Alles auswählen

i = i.__add__(2.5)
Da gibt es NotImplemented, Integer kann keine Floatzahlen rechnen. Nacher versucht Python die umgekehrte Rechnung

Code: Alles auswählen

i = 2.5.__radd__(i)
i wird an die Floatzahl 3.5 gebunden

Darum ist i nacher eine Floatzahl.

Gruss

Verfasst: Mittwoch 21. Februar 2007, 10:48
von mkesper
rayo hat geschrieben: Integers sind unveränderbare Objekte, dass heisst, wenn sich der Wert ändert muss ein neues Objekt erstellt werden und i ist nacher an das neue Objekt gebunden.
Eben, ich habe eigentlich damit gerechnet, daß ein Fehler erzeugt wird bzw. der Wert abgeschnitten/gerundet wird. Ich hätte nicht gedacht, daß Python mir ein neues Objekt unterschiebt. Das heißt für mich, daß man unter Umständen vorsichtig mit solchen Erwartungen sein muß.

Verfasst: Mittwoch 21. Februar 2007, 11:25
von rayo
Hi

Python schiebt dir auch ein neues Objekt unter wenn du i += 2 machst, nur ist halt dann das neue Objekt per zufall wieder ein Integer.

Also nicht wirklich verwunderlich.

Gruss

Verfasst: Mittwoch 21. Februar 2007, 12:04
von Y0Gi
NotImplemented wird für Funktionen und Methoden geworfen, die existieren, aber dessen Rumpf (noch) nicht implementiert ist. Das kann der Fall sein bei geerbten oder überladenen Methoden, die aber für die Subklasse nicht sinnvoll sind; bei "handgemachten" abstrakten Klassen oder Interfaces (die es so in Python nicht syntaktisch gibt, sondern mehr oder weniger nur als Konvention umgesetzt werden können), also Klassen, deren Methoden erst in der Subklasse gefüllt werden sollen; oder wenn die Entwickler die Methode noch nicht fertig gestellt haben :)

Verfasst: Mittwoch 21. Februar 2007, 12:52
von sunmountain
Python wählt immer den Typ, der am besten passt:

float + int = ? -> float, da Wertebereich größer
int + int = ? int oder longint, je nach ergebnis
etc. etc.

Siehe auch das hier : http://docs.python.org/ref/types.html

Verfasst: Sonntag 25. Februar 2007, 03:09
von Leonidas
mkallas hat geschrieben:

Code: Alles auswählen

>>> i=1
>>> type(i)
<type 'int'>
>>> i += 2.5
>>> type(i)
<type 'float'>
Ich hätte erwartet, daß i ein Integer bleibt.
Und wie hätte ein Integer den Wert 3.5 aufnehmen sollen? Etwa als 3? Das fände ich allerdings wesentlich seltsamer. Es ist ja schon bei der Division oftmals für Einsteiger verwunderlich, warum ``1 / 3`` nicht das liefert, was sie haben wollen.