2017-07-03 5 views
0

私が正しいだ場合:sys._getframe()です.f_builtinsと__builtins __.__ dict__は同等ですか?

  • sys._getframe().f_builtinsは、現在のコールスタックの最上部のフレームで、組み込みオブジェクトです。および

  • __builtins__.__dict__は、現在のモジュールの組み込みオブジェクトです。

sys._getframe().f_builtins__builtins__.__dict__の値の間にどのような違いがあるのですか?彼らは常に同じ価値を持ちますか、つまり同じ組み込みオブジェクトですか?

答えて

2

sys._getframe().f_builtins__builtins__.__dict__の値にはどのような違いがありますか?彼らは常に同じ価値を持ちますか、つまり同じ組み込みオブジェクトですか?

はい。

Pythonの組み込みの名前は、スコープと名前空間で同じままです。だからこそ彼らは"builtins"と呼ばれるのです;インタプリタに組み込まれているのでどこからでもアクセスできます。組み込みマッピングを明示的に変更しない限り、それらは同じになります。

しかし、それだけではなく、両方とも同じビルトインマッピングを指しています。つまり、__builtins__.__dict__の変更はsys._get_frame().f_builtinsに変更され、その逆も同様です。

また、これは単純な例でテストすることができます。私たちはframe.f_builtinsに新しい組み込み名を追加

>>> import sys 
>>> frame = sys._getframe() 
>>> 
>>> frame.f_builtins == __builtins__.__dict__ 
True 
>>> frame.f_builtins['abc'] = 3 
>>> frame.f_builtins['abc'] 
3 
>>> frame.f_builtins == __builtins__.__dict__ 
True 
>>> 

すると、__builtins__.__dict__も変更しました。

注: はCPythonの実装の詳細であり、他のPython実装には存在しない可能性があります。だからそれに頼らないでください。代わりに、builtinsモジュールを使用してください。

+0

ありがとうございました。 'frame.f_builtins == __builtins __.__ dict__'の' == 'は、2つのオペランドが同じオブジェクトにバインドされているかどうか、または2つのオペランドにバインドされているオブジェクトが同じ値/ – Tim

+0

@Tim 'dict'の内容が同じかどうか比較します。同じ内容の2つの辞書オブジェクトを作成し、それらが等しいかどうかを確認することで、これを試すことができます。 –

1

実行フレームの組み込み関数(f_builtins属性によって評価されたもの)が__builtin__モジュールにアクセスするだけと異なる場合はありません。ただし、カスタムコードを操作すると、f_builtinsが異なる可能性があります。 this sourceによれば

直接アクセスする方法は、評価()またはEXECを使用しビルトイン部材と 「グローバル」辞書を指定することです。存在する場合、この はコードの組み込みコードになり、フレームのf_builtinsに表示されます。 などです。 f_builtinsに標準でない値を持つコードフレームは であり、CPython内部のさまざまなビットは異なって振る舞います(通常、それらはさまざまな操作を禁止します。たとえば、クラスに属性を設定するのは です)。今度は廃止されたrexecをサポートするために、これはすべて であるようです。Pyモジュールでは、信頼できないPythonコードが何をすることができるのかを(あなたが推測した)ところで に制限しようとしています。

関連する問題