Hallo D!
da.dom hat geschrieben:a) Kann mir jemand noch mal genauer erklären was in dem ersten dict landet? Sind das die buildin objekte die er global ablegt? (hab in der API was von global und local variablen gelesen
Ja, Python unterscheidet zwischen zwei Namensräumen, dem Globalen und dem Lokalen. Um diese zu simulieren, werden bis zu zwei Dictionaries benötigt. Wenn exec beispielsweise eine Funktion ausführt, in der bestimmte globale Namen definiert werden, dann werden Änderungen daran im globalen Dict durchgeführt, sonst im lokalen.
Wie das __builtins__ nun ausgerechnet in das anfangs leere, globale Dict kommt, kann ich nicht genau sagen. Es wird aber damit zusammenhängen, dass diese Variablen immer global definiert sind, um auf die Grundfunktionen überhaupt zugreifen zu können.
da.dom hat geschrieben:b) der optionale Parameter "in" ist mir in diesem Fall nicht ganz klar geworden, er definiert den Scope in dem das ganze ausgeführt werden soll. Was er in diesem Fall macht sieht man ja, aber gibt es da noch andere Anwedungsszenarien für den Parameter, ausser dict's aus Strings zu parsen?
Nicht das 'in', sondern das 'exec' führt den String so aus, als ob es Quelltext in einer Python-Quellcodedatei ist. Eine Angabe von dictionaries ist nicht notwendig und wenn weggelassen wird der Code in den aktuellen Namensräumen ausgeführt. Das ist die wahrscheinlich mächtigste Funktion, da sie sich selbst generierenden Code dynamisch ausführen und so zu teuflischen Ergebnissen führen kann, gelinde gesagt. Deshalb sollte man eine Ausführung im aktuellen Namensraum tunlichst vermeiden und außerdem brauchst Du die eingelesenen Variablen ja sowieso in einem Dict.
'in' dient in diesem Fall, ebenso wie in 'enthält'-Prüfungen a la
, als Schlüsselwort in einem fest definierten Konstrukt. In letzterem Fall bewirkt es einen Aufruf der dict-Methode __contains__ mit key als Argument. Allein kann es aber niemals eine Funktion ausführen.
Ich hoffe, das beantwortet das eine oder andere.
LG,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...