ついでにArduinoやProcessingみたいに setup だとか loop や draw みたいに簡単にコードが書けてループ処理が隠蔽出来ると最高。
child.py
#!/usr/bin/python3
import inspect
def getParent():
s = inspect.stack()
for i in s:
if (i[3] == "<module>") & (i[1] != "<stdin>"):
_parent = inspect.getmodule(i[0])
return _parent
def isDef( funcName ):
p = getParent()
d = set(dir(p))
return len(d & {funcName}) == 1
前ポストのgetParent
を使い親のモジュールを取得してdir
でファンクション一覧を取得。存在するか見ているだけで簡単。
ただし、これをどのタイミングで動かすかが問題。
import child
print(child.isDef("hello"))
def hello():
print("hello")
これは動かない例。
import child
def hello():
print("hello")
print(child.isDef("hello"))
こっちは動く例。
HTML5とかのDOMの感覚といえばいいのかな。
気持ち的にはモジュールを読み込んだ時点で走査したいのだけれどもまだ呼び出し元のモジュール全体が読まれていないのでそれは出来ないということ。
正常に動作させるためには呼び出し元モジュールが全て読み込み終わってからでないといけない。
ないものはないので仕方がない、でも煩わしさは出来る限り取り除きたい。
child.py
#!/usr/bin/python3
import inspect
def getParent():
s = inspect.stack()
for i in s:
if (i[3] == "<module>") & (i[1] != "<stdin>"):
_parent = inspect.getmodule(i[0])
return _parent
def isDef( funcName ):
p = getParent()
d = set(dir(p))
return len(d & {funcName}) == 1
def run():
if isDef("loop"):
p = getParent()
p.loop()
main.py
import child
def loop():
print("hello")
child.run()
なんか釈然としないけれどこれがスマートかな? 思い返してみればこういう作りしてるの多い気がする。
getParent
の処理、内容はスタックトレースなので最後の行が起点にしかならない気がしてきた。つまり
これでいいんじゃないかと。
つまりこれでOK?
child.py