Ich habe gerade unten Abfrage zu comp.lang.python gepostet, aber ich fühle diese Art von Frage hat eine Art von right-of-way hier auf Stack Overflow, auch, so sei es wiederholt. die Essenz: warum hat "builtins" zwei verschiedene Interpretationen in Python 3?
Ich würde sehr gerne jeden Kommentar darüber akzeptieren, was dieser Satz, nachgelesen aus http://celabs.com/python-3.1/reference/executionmodel.html , bedeutet, oder warum die Götter entschieden haben, dass dies der richtige Weg ist. erwarte, dass dieser Kay Schluehr sich dazu äußern wird, oder vielleicht wird sich sogar der BDFL dazu äußern __builtins__
die den richtigen Weg zu seinen Anhängern, Anhängern und Mitstreitern::
The built-in namespace associated with the execution of
a code block is actually found by looking up the name
\_\_builtins\_\_ in its global namespace; this should be a
dictionary or a module (in the latter case the module’s
dictionary is used). By default, when in the \_\_main\_\_
module, \_\_builtins\_\_ is the built-in module builtins;
when in any other module, \_\_builtins\_\_ is an alias for
the dictionary of the builtins module itself.
\_\_builtins\_\_ can be set to a user-created dictionary to
create a weak form of restricted execution.
Früher gab es mindestens zwei verschiedene Begriffe, 'builtin' (im Singular) und 'builtins' (im Plural), einige von die sowohl in Modul- als auch in Diktatform existierten (?nur eine Vermutung?). jetzt gibt es nur noch builtins
Zum Glück ist die Ambivalenz zwischen Singular und Plural verschwunden ist - gut, dass wir das los sind.
aber warum ist __builtins__
seine Bedeutung ändern, je nachdem, ob der Bereich des "Skripts" ist (d.h. das Modul, dessen Name vorhanden ist, wenn der Aufruf python foobar.py
) oder ob es sich um die Bereich eines sekundären Moduls (importiert oder ausgeführt, direkt oder indirekt, durch foobar.py
)? ich verstehe die Argumentation nicht und finde es sehr verwirrend.
Begründung: Was kümmert mich das? Ich möchte in der Lage sein, Namen in die Datenbank zu exportieren. globalen Namensraum zu exportieren, die nicht als privat (durch einen Unterstrich) markiert wurden Präfix) in einem Python-Modul, das ich über exec( compile( get ( locator ), locator, 'exec' ), R )
wobei R
soll gehen die privaten Namen des genannten Moduls enthalten". ist ein wenig obskur, aber aber die Grundübung besteht darin, das Importsystem von Python zu umgehen und ähnliche Ergebnisse zu erzielen. Ergebnisse zu erzielen... es geht darum, Namen in den all-globalen und den modul-globalen Namespaces zu injizieren.