Seite 1 von 1

Ist euch langweilig? Dann lest meine Frage...

Verfasst: Mittwoch 7. März 2012, 11:11
von akis.kapo
Hi,

ich hab hier ne MEEEGAAA unkritische Frage an die Pyfon Gurus... :)

Ich habe folgenden Codeabschnitt ändern wollen:

Code: Alles auswählen

if key in myDict:
    del myDict[key]
...nach...

Code: Alles auswählen

del myDict.get(key, [])
Geht wohl nicht. Fehlermeldung:

Code: Alles auswählen

SyntaxError: can't delete function call
Der Witz ist (wie bin ich überhaupt darauf gekommen...),
ich habe vorher in der python shell folgendes ausprobiert, erfolgreich:

Code: Alles auswählen

del []
Also ich nehme daraus mit:
1. man kann ein namensloses Objekt "[]" (leere Liste) per del löschen, ohne Fehler/Excpetion
2. del erhält im neuen Code (nacher) nicht, wie erwartet, die leere Liste "[]", sondern eine Funktion (.get()?)

Meine Frage dazu: Wieso???

Wo ist hier der Denkfehler?

Wie gesagt, Frage ist ultra-unkritisch, ich hab den Code einfach auf den ursprünglichen Zustand zurückgesetzt und es geht jetzt wieder.

Ich brauche nur ne schlüssige Erklärung, wieso der Ansatz schlecht/dumm war.
Ich hätte echt erwartet, der neue Code läuft anstandslos, zumindest habe ich das als "sehr natürlich" empfunden beim schreiben, bis ich es getestet habe... :)

Aber sonst geht's mir gut,
Danke der Nachfrage. xD
Liebe Grüße an alle. :D

Re: Ist euch langweilig? Dann lest meine Frage...

Verfasst: Mittwoch 7. März 2012, 11:29
von snafu
Ich finde es schon komisch, dass `del []` anstandslos geschluckt wird. Ein `del "foo"` geht zum Beispiel nicht. Ist ja auch nachvollziehbar, denn bei `del` geht es um das Löschen von Zuweisungen, nicht direkt um das Löschen der Objekte. Die Objekte werden halt nur dann vom GC abgeräumt, wenn kein Name mehr an ihnen gebunden ist.

Dass es bei deinem Beispiel einmal geht und einmal nicht, ist auch aufgrund der merkwürdigen Fehlermeldung verwirrend und inkonsistent. Habe da auch keine plausible Erklärung für. IMHO müsste, wie du schon gesagt hast, am Ende zu `del []` aufgelöst werden.

//edit: Wobei sich Python generell nicht für das Ergebnis eines Funktionsaufrufes zu interessieren scheint, wenn es um `del` geht:

Code: Alles auswählen

>>> def test(obj):
...     return obj
... 
>>> del test()
  File "<stdin>", line 1
SyntaxError: can't delete function call
So merkwürdig ist die Fehlermeldung dann also doch nicht. Könnte trotzdem etwas klarer ausgedrückt werden. Eventuell steht in der Sprachreferenz was dazu. Mal gucken...

Und mir fällt zudem auf, dass die Funktion wohl garnicht betreten wird. Denn ich hatte vergessen, ein Argument als `obj` mitzugeben, was aber offensichtlich nicht weiter bemängelt wird. Da scheint also noch nicht mal eine Auswertung der Funktionssignatur stattgefunden, wenn der Fehler entdeckt und geworfen wird.

Re: Ist euch langweilig? Dann lest meine Frage...

Verfasst: Mittwoch 7. März 2012, 11:47
von EyDu
del erwartet auf der rechten Seite eine target_list. In der Dokumentation ist der Fall einer leeren target_list wohl nicht vorgesehen, ich könnte mir aber vorstellen, dass man hier das Verhalten großzügig erweitert hat.

Re: Ist euch langweilig? Dann lest meine Frage...

Verfasst: Mittwoch 7. März 2012, 12:11
von snafu
@EyDu: Heißt also, ein `del liste` wird bei Python nicht auf die Liste als Ganzes bezogen, sondern es werden stattdessen einzeln die beinhalteten Elemente/Namen abgearbeitet (und wenn die Liste von Anfang an leer ist, passier halt nix)? Hm, ist zugegeben neues Terrain für mich...

Re: Ist euch langweilig? Dann lest meine Frage...

Verfasst: Mittwoch 7. März 2012, 13:28
von Leonidas
snafu hat geschrieben:@EyDu: Heißt also, ein `del liste` wird bei Python nicht auf die Liste als Ganzes bezogen, sondern es werden stattdessen einzeln die beinhalteten Elemente/Namen abgearbeitet (und wenn die Liste von Anfang an leer ist, passier halt nix)?
So wie ich das sehe ist das tatsächlich so. Die Idee ist wohl, dass man ``del a, b, c`` machen kann. Mit anderen Worten: alles was man links von einer Zuweisung haben kann, kann man rechts in einem ``del`` aufruf wieder löschen. Zumindest ist das kein Syntax-Fehler. ``[] = 42`` kann man trotzdem nicht machen, aber nicht wegen der Grammatik sondern der Semantik.

An dieser Stelle: Python 3 unterstützt an der Stelle auch sowas: ``a, *b, c = 3, 4, 5, 6, 7, 8`` womit wir etwas näher an Destructuring wie in (meist) funktionalen Sprachen ranrücken.