Interpreter Meldung NotImplemented

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

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
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

@ 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.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

Okay Frage beantwortet, danke!
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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.
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

@ 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
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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ß.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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 :)
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten