如果你真的想这样做(你真的不想这样做),你总是可以从外部a
注入。b
一个.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
函数可能会更干净:
一个.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
而不依赖于你的主要,这是你试图避免的。
一个.py:
def a():
print "a"
b.py:
import a
def b():
a.a()
主要.py:
import b
if __name__ == '__main__':
b.b()
很好很简单。真的,在这种情况下你甚至不需要那个if __name__
位,因为没有人会import main
。