Ist euch langweilig? Dann lest meine Frage...

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
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

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
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Zuletzt geändert von snafu am Mittwoch 7. März 2012, 12:18, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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

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