如果你真的想这样做(你真的不想这样做),你总是可以从外部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。