3

以下のクエリを 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.pyfoobar.py

論理的根拠: なぜ気にする必要があるのですか? —プライベート名を保持することになっているexec( compile( get ( locator ), locator, 'exec' ), R )場所を介して実行する Python モジュールで (アンダースコア プレフィックスによって) プライベートとマークされていない名前をグローバル名前空間にエクスポートできるようにしたいのです。R当該モジュールの」。少し難解です、基本的な演習は、python のインポート システムをバイパスして、同様の結果を取得することです。すべては、全グローバルおよびモジュール グローバルの名前空間に名前を注入することです。

4

1 に答える 1

1

getattr(__builtins__, '__dict__', __builtins__)dict(属性__builtins__がないため、dict自体である3番目の引数を返します)またはモジュール(次にその属性を持ってい、それを返します)。これが回避策です。Python がこのような複雑な回避策を必要とする方法で動作することが文書化されている理由については、実装の問題がユーザーに表示される (そして実際に文書化されている) レベルにまで表面化するという不幸なケースとして分類します (ため息)。残念ながら、Python 3 への移行でこれを修正することは考えていませんでしたが、今では後方互換性のない変更を行うには遅すぎます:-(.__dict__getattr__builtins__getattr

于 2010-01-31T21:38:38.847 に答える