以下のクエリを comp.lang.python に投稿したばかりですが、この種の質問には、ここスタック オーバーフローでも何らかの権利があると感じているので、繰り返してください。本質: Python 3 で「ビルトイン」に 2 つの異なる解釈があるのはなぜですか?
http://celabs.com/python-3.1/reference/executionmodel.htmlから収集されたこの文が何を意味するのか、またはなぜ神がこれが進むべき道であると判断したのかについてのコメントを喜んで受け入れます。Kay Schluehrという名前のこの男がそれについて発言することを期待してい__builtins__
ます.
の実行に関連付けられた組み込みの名前空間 コードブロックは実際には名前を調べることで見つかります グローバル名前空間の __builtins__; これは 辞書またはモジュール (後者の場合、モジュールの 辞書を使用します)。デフォルトでは、__main__ の場合 モジュール、__builtins__ はビルトイン モジュールのビルトインです。 他のモジュールの場合、 __builtins__ はのエイリアスです builtins モジュール自体の辞書。 __builtins__ をユーザー作成の辞書に設定して、 制限された実行の弱い形式を作成します。
以前は、'builtin' (単数形) と 'builtins' (複数形) という少なくとも 2 つの異なる用語があり、そのうちのいくつかはモジュールと dict の両方の形式で存在していました (?ただの推測ですか?) . 現在は しかありませんbuiltins
。幸いなことに、単数形と複数形の間のあいまいさはなくなりました。
しかし、これが「スクリプト」のスコープであるか (つまり、 を呼び出したときに名前が存在していたモジュール)、またはこれがセカンダリ モジュールのスコープであるか (直接的または間接的にインポートまたは実行される)__builtins__
によって、その意味が変わるのはなぜですか? )? この背後にある理由を理解できず、非常に混乱しています。python foobar.py
foobar.py
論理的根拠: なぜ気にする必要があるのですか? —プライベート名を保持することになっているexec( compile( get
( locator ), locator, 'exec' ), R )
場所を介して実行する Python モジュールで (アンダースコア プレフィックスによって) プライベートとマークされていない名前をグローバル名前空間にエクスポートできるようにしたいのです。R
当該モジュールの」。少し難解ですが、基本的な演習は、python のインポート システムをバイパスして、同様の結果を取得することです。すべては、全グローバルおよびモジュール グローバルの名前空間に名前を注入することです。