0

这是2个py文件

aa.py

import bb
b = 3
bb.foo()

bb.py

import aa
def foo():
    print(aa.b)

从 aa.py 运行时,出现此错误

Traceback (most recent call last):
  File "D:\pyproj\Mytest\src\aa.py", line 7, in <module>
    import bb
  File "D:\pyproj\Mytest\src\bb.py", line 6, in <module>
    import aa
  File "D:\pyproj\Mytest\src\aa.py", line 9, in <module>
    bb.foo()
AttributeError: 'module' object has no attribute 'foo'

另一集

只是我想解决问题,但我注意到一些有趣或有线的东西

我修改了测试

aa.py

print('before import bb in aa.py')
import bb
print('after import bb in aa.py')
bb.foo()
print('end of all')

bb.py

def foo():
    print('before import aa in bb.foo()')
    import aa
    print('after import aa in bb.foo()')

从 aa.py 开始

before import bb in aa.py
after import bb in aa.py
before import aa in bb.foo()
before import bb in aa.py
after import bb in aa.py
before import aa in bb.foo()
after import aa in bb.foo()
end of all
after import aa in bb.foo()
end of all

谁能解释一下?

4

2 回答 2

4

The problem is a circular dependency: aa imports bb, which imports aa. Then aa calls bb.foo(), but this function has not yet been completely defined in bb, since the import of aa is not completed.

It is better to avoid such complex dependencies. What you can do is pass aa.b as an argument to bb.foo():

aa.py

import bb
b = 3
bb.foo(b)

bb.py

def foo(b):
    print(b)
于 2012-08-31T07:30:52.813 回答
4

This is the circular dependency problem, You should import aa in bb.py locally not globally:

def foo():
    import aa
    print(aa.b)
于 2012-08-31T07:32:36.697 回答