どうにかならないかと書いてみた
import inspect
def getParent():
#c = 0
for i in inspect.stack():
if i[3] == "<module>":
#_parent = inspect.getmodule(inspect.stack()[c][0])
_parent = inspect.getmodule(i[0])
#c += 1
return _parent
※余計な処理をコメントアウト、修正した
inspect.stack()の内容は
[FrameInfo(frame=<frame object at 0x76b197b0>, filename='<stdin>', lineno=1, function='<module>', code_context=None, index=None)]
このような感じになっている。いわゆるスタックトレースで、
- 0 frame
- 1 filename
- 2 lineno
- 3 function
- 4 code_context
- 5 index
といった具合に6つの項目があり、呼び出し元がモジュールであれば 3 function が <module>
となる。
ので、その行を見つけてinspect.getmoduleする。
呼び出しがネストされていれば当然スタックトレースの行は変わるもののREPLなどから利用していない限りはこれで行けるのではないかなぁ、
REPLの場合 1 filename が <stdin>
になるような気もするのでこれをパスしてやるのも手かもしれない。