あなたが間違った質問をしていることはほぼ確実であり、Raymond Hettinger の答えは、ほぼ確実にあなたが本当に求めているものです。
このようなことは、学習目的で CPython インタープリターの内部を掘り下げたり、セキュリティ ホールなどを監査したりするのに役立つかもしれません…しかし、その場合でも、Python インタープリターをプログラムに埋め込み、公開する関数を作成する方がよいでしょう。 Python インタープリターに必要なものは何でも、または少なくとも CPython オブジェクトを操作できる C 拡張モジュールを作成します。
ただし、これを行う必要がある場合は…</p>
まず、 からアドレスを取得する信頼できる方法さえありませんrepr
。eval
便利な表現を持つほとんどのオブジェクトは、代わりにそれを提供します。たとえば、 repr は('1', 1)
is "('1', 1)"
, not<tuple at 0x10ed51908>
です。また、有用な表現を持たないオブジェクトの場合でも、戻り<TYPE at ADDR>
値は、多くの型が従う明示されていない規則 (およびユーザー定義クラスのデフォルト) に過ぎず、信頼できるものではありません。
ただし、おそらく CPython だけを気にするので、次のものに頼ることができますid
。
CPython 実装の詳細: これはメモリ内のオブジェクトのアドレスです。
(もちろん、呼び出すid
(またはrepr
)オブジェクトがある場合は、ポインターを介して逆参照する必要はありません。オブジェクトがない場合は、おそらくガベージコレクションされているため、逆参照するものはありませんが、おそらくまだ持っていて、どこに置いたか思い出せない…)
次に、このアドレスをどうしますか? まあ、Python は の反対を行う関数を公開していませんid
。しかし、Python C APIは十分に文書化されています。また、Python が共有ライブラリを中心に構築されている場合、その C API は を介しctypes
てロードするだけでアクセスできます。実際、ctypes
C API を呼び出すために適切な共有ライブラリを自動的にロードする特別な変数が用意されていますctypes.pythonapi
。
の非常に古いバージョンではctypes
、次のように、明示的に検索してロードする必要がある場合がありますpydll = ctypes.cdll.LoadLibrary('/usr/lib/libpython2.5.so')
(これは、Python 2.5 が /usr/lib にインストールされている Linux の場合です。明らかに、これらの詳細のいずれかが異なる場合、正確なコマンド ラインは異なります。)
もちろん、これを実行して Python インタープリターをクラッシュさせる方が、何か役に立つことをするよりもはるかに簡単ですが、何か役に立つことをするのは不可能ではありません。