2

Python 项目逐渐增大,循环导入时,一不留神可能碰到错误:

ImportError: cannot import name ‘<name>’

出现此问题一般是因为在导入模块时顺序上了问题
看如下例子:

./test
    ├── main.py
    ├── sub_a.py
    ├── sub_b.py
# main.py
from sub_a import x
print(x + 1)
# sub_a.py
from sub_b import b

a = 1
x = a + b
print(x)
# sub_b.py
from sub_a import a
b = a + 1

运行:

python module_a.py
Traceback (most recent call last):
  File ".\main.py", line 1, in <module>
    from sub_a import x
  File "~\test\sub_a.py", line 1, in <module>
    from sub_b import b
  File "~\test\sub_b.py", line 1, in <module>
    from sub_a import a
ImportError: cannot import name 'a'

main.py进入sub_a.py 中执行from sub_b import b语句,在这里程序进入sub_b.py中执行,'sub_a.py'程序暂停执行,此时需要在sub_b.py使用的sub_a.py 中的 a = 1 变量还没有生成,因此出现了上述错误。

要避免错误,要保证在导入模块中内容时,此内容在程序执行到此处时已定义

module_a.py 改为:

a = 1
from sub_b import b
x = a + b

Flask 中的实际示例:

# app.py

from flask_mongoengine import MongoEngine
# 导入
from .views.main import main as main_blueprint

# 定义
db = MongoEngine()

# 使用
app.register_blueprint(main_blueprint)
# views.main.py

# 导入
from user import User

# 使用
Users.objects()            
# users.py

# 导入
from app import db            

# 使用
class Users(db.Document):
    id = db.StringField(primary_key=True)
    name = db.StringField(required=True)

app.py 文件改为:

# app.py

from flask_mongoengine import MongoEngine

# 定义
db = MongoEngine()


# 导入
from .views.main import main as main_blueprint
# 使用
app.register_blueprint(main_blueprint)

l1xnan
549 声望19 粉丝

每天进步一点点……