16

私は PyQt で Qt を使用する方法を学んでおり、StandardItemModel を持つ QTabelView を持っています。モデルを正常に作成し、itemChanged シグナルをスロットに接続しました。IPythonで返されるオブジェクトをいじりたいので、現在次の行があります。

def itemChangedSlot(epw, item):
    new_data = item.data()
    print new_data
    print item

印刷する

<PyQt4.QtGui.QStandardItem object at 0x07C5F930>
<PyQt4.QtCore.QVariant object at 0x07D331F0>

IPython セッションで、このメモリ アドレスを使用してオブジェクトを取得することは可能ですか? Google で何も表示されません。用語が間違っているのでしょうか。

4

2 に答える 2

11

あなたが間違った質問をしていることはほぼ確実であり、Raymond Hettinger の答えは、ほぼ確実にあなたが本当に求めているものです。

このようなことは、学習目的で CPython インタープリターの内部を掘り下げたり、セキュリティ ホールなどを監査したりするのに役立つかもしれません…しかし、その場合でも、Python インタープリターをプログラムに埋め込み、公開する関数を作成する方がよいでしょう。 Python インタープリターに必要なものは何でも、または少なくとも CPython オブジェクトを操作できる C 拡張モジュールを作成します。

ただし、これを行う必要がある場合は…</p>

まず、 からアドレスを取得する信頼できる方法さえありませんrepreval便利な表現を持つほとんどのオブジェクトは、代わりにそれを提供します。たとえば、 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​​てロードするだけでアクセスできます。実際、ctypesC API を呼び出すために適切な共有ライブラリを自動的にロードする特別な変数が用意されていますctypes.pythonapi

の非常に古いバージョンではctypes、次のように、明示的に検索してロードする必要がある場合がありますpydll = ctypes.cdll.LoadLibrary('/usr/lib/libpython2.5.so')(これは、Python 2.5 が /usr/lib にインストールされている Linux の場合です。明らかに、これらの詳細のいずれかが異なる場合、正確なコマンド ラインは異なります。)

もちろん、これを実行して Python インタープリターをクラッシュさせる方が、何か役に立つことをするよりもはるかに簡単ですが、何か役に立つことをするのは不可能ではありません。

于 2013-04-01T18:50:30.240 に答える