2012-03-23 5 views
3

これは通常はやってはいけないことですが、私はその理由を知っています。しかし、私はそれを呼び出すモジュールに関するいくつかの情報を表示するクラス内でデバッグ機能を作っています。呼び出しモジュールのネームスペースにアクセスする

名前空間で1つ上のレベルに上がってこのモジュールを呼び出すプログラムに常に存在する変数を見つける方法を知っておく必要があります。

私は1つがメインネームスペースを取得することができます知っている:

import __main__ 

しかし、私は、これは以降の非常に最初の打ち上げのモジュールからすべてが含まれていることを推測している、と私はこの1つだけと呼ばれるものをしたいです。

答えて

1

試してみてください。Python interpreter stack

+0

私は最終的に名前空間に上がることなく私が望んでいたことをする方法を見つけましたが、これは、私は答えとしてそれを選択しています。 – Kelketek

1

'デバッグオブジェクト'を呼び出すオブジェクトは、パラメータとしてselfを渡すだけです。次に、「デバッグオブジェクト」はすべての呼び出し元属性にアクセスできます。例:

class Custom(object): 
    def __init__(self): 
     self.detail = 77 

    def call_bug(self, name): 
     name.bug(self) 

class Debugger(object): 
    def bug(self, caller): 
     print caller.__dict__ 

custom = Custom() 
debugger = Debugger() 
custom.call_bug(debugger) 

output: 
{'detail': 77} 

この原則は、異なるファイル間で問題なく動作します。

+0

私はそれほど意味がありません。これは__repr__からの表示を得るためです。そのため、実際に関数を呼び出す方法を変更することはできません。私は機能を外部に持ち帰ったとしか言えません。 __repr__の出力は、それを呼び出す関数に応じて変更する必要があります。 Er、それは2つのアンダースコア、次にrepr、そしてさらに2つのアンダースコアです。ここで正しく書式設定されていません。これは、オブジェクトがリストの中に印刷されたときにそのオブジェクトを表現するために使用される文字列です。 – Kelketek

+1

@Kelketek - あぁそうだ。私はあなたが 'inspect'モジュールを使う必要があると思います。これにより、ライブオブジェクトとその属性を見ることができます。また、後方に移動して呼び出し元オブジェクト/名前空間を見つけることもできます。 'inspect.getframeinfo(inspect.currentframe()。f_back.f_back)' – fraxel

関連する問題