2017-05-15 12 views
2

私は3つのモジュールa.py、b.py、c.pyを持っています。 a.pyモジュールは基本モジュールです。私が達成したいのは、a.pyがb.pyによってインポートされたときと、a.pyがc.pyによってインポートされたときに、異なる動作をすることです。 異なるモジュールの異なるインポート動作

b.py

import a 
print(a.x) 

(5を返します。例:b.pyこのように呼び出す

a.pyしたがって

def ab(): 
    return 5 

def ac(): 
    return 6 

if __nameoftheimportmodule__ == 'b': 
    x = ab() 
elif __nameoftheimportmodule == 'c': 
    x = ac() 
else: 
    pass 

の場合はc.py 6)を返します。

私の質問は、そのような設計が可能かどうかです(たとえば、上記のような名前のハイパーモジュールのように動作する機能が存在するかどうか)。私はその動作を一致させるために見つけることができる

答えて

0

最も近いソリューションはinspect module's stack functionを使用している:

import inspect 

def ab(): 
    return 5 

def ac(): 
    return 6 

if inspect.stack()[1][1] == 'b.py': 
    x = ab() 
elif inspect.stack()[1][1] == 'c.py': 
    x = ac() 
else: 
    pass 

inspect.stack()を:

戻り呼び出し元スタックのフレームレコードのリストを。返されるリストの最初のエントリ は、呼び出し元を表します。最後のエントリは、スタック上の最も外側のコール を表します。 'c.py'を取得するstack[1][1]として

inspect.stack()a.pyから呼び出されたとき、私たちは

[(<frame object at 0x102c25dd0>, '/Users/home/43985900/a.py', 3, '<module>', ['print inspect.stack()\n'], 0), (<frame object at 0x102c25c20>, 'c.py', 1, '<module>', ['print(a.x)\n'], -1)] 

を取得する私たちは興味を持っている「最後のエントリスタック上の最も外側の呼び出しを表す」私たちのインデックスstack、これを呼び出したモジュールのファイル名と比較しました。今

我々は我々が期待される出力を得るモジュールの実行テスト:Get name of calling function's module in Python:この質問の答えから適応

$ python c.py 
6 
$ python b.py 
5 

を。

0

インポートシステムを非常に難しくする必要があります。特に、通常は2番目のモジュールがインポートするときにモジュールのコードが再び実行されないためです。 Pythonは最初のインポート時に作成された同じモジュールオブジェクトを再利用し、同じ値のxを保存します。

__import__を置き換えるか、または読み込みシステムが提供する些細なことのないフックの1つを使用してもかまいませんが、それはそれほど価値がありませんし、理解しやすい理由や理由がないプログラム約。

関連する問題