もしあなたが本当にこれをしたいのであれば (そしてあなたが本当にしたくないのであれば)、いつでも外部から注入することができますa
。b
a.py:
import b
def a():
print "a"
b.a = a
if __name__ == "__main__":
b.b()
b.py:
"""NOTE: Before you can use this module, you must set `b.a` to a function of
no arguments that does ____!"""
def b():
a()
set_a
代わりに関数を持つ方がおそらくきれいでしょう:
a.py:
import b
def a():
print "a"
b.set_a(a)
if __name__ == "__main__":
b.b()
b.py:
a = None
def set_a(func):
a = func
def b():
if not a:
raise Exception('You must call b.set_a before you can call b.b!')
a()
このバージョンのパターンは、実際に時々発生します。のユーザーがオブジェクトb
について考える必要がない場合b.B
もあるため、 のように、シングルトン オブジェクトを使用する便利な関数がありますrandom
。ここで、B
関数を受け取る必要がある関数 (例: ハンドラー、コールバック、代替ソケット ファクトリなど) がある場合は、おそらくb.set_a
型関数を使用します。
とにかく、コメントで説明したように、正しい答えはa.py
、モジュールとそれを呼び出すa.py
別のスクリプトにリファクタリングすることだと思います。main.py
次に、メインにb.py
依存せずに依存できa
ます。これは、回避しようとしていたものです。
a.py:
def a():
print "a"
b.py:
import a
def b():
a.a()
main.py:
import b
if __name__ == '__main__':
b.b()
素敵でシンプル。if __name__
そして、実際には、この場合はビットさえ必要ありませんimport main
。