再看flask web开发一书,里面有两段代码
app/main/__init__.py:
from flask import Blueprint
main = Blueprint('main', __name__)
from . import views, errors
app/main/errors.py:
from . import main
在知乎看到如下理解from . import XXX
是在当前程序所在文件夹里__init__.py程序中导入XXX,
想导入的函数不在当前文件夹,那么就有可能用到 from .. import XXX
(即上一个文件夹中的__init__.py),或者from ..A import XXX
(即上一个文件夹中的文件A)
问题1:书中在__init__.py中使用这样的写法要怎么样理解,__init__.py中并没有views, errors。
问题2:为什么在__init__.py中将from . import views, errors放到最后就不会循环导入
补充问题2:是不是因为errors.py中的from . import main只是从__init__.py中导入那个蓝本对象,只要导入完了那个蓝本,接下来的代码就不会运行和导入,所以就不会运行被放在最后的from . import views, errors
回答1:
'from . import XXX'是在当前程序所在文件夹里__init__.py程序中导入XXX
这句话表述有误,应该为在当前__init__.py所在的文件夹下导入XXX,可以看到__init__.py在main文件夹下,同层级的还有errors.py,forms.py,views.py,因此用相对引用可以导入,from . import views, errors
回答2:
因为views.py 和 errors.py要导入main blueprint,我们要等到main被创建出来才能够导入路由和错误处理。
如果先导入view.py和errors.py,而这两个需要等待main blueprint,此时main还未被创建,就形成了循环依赖。
1个是绝对引用,另1个是相对引用的。