首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Coding
V2EX  ›  Python

Python 循环导入的大坑(模拟 Flask 典型场景)

  •  
  •   guyskk · 2016-12-03 16:38:14 +08:00 · 2403 次点击
    这是一个创建于 1104 天前的主题,其中的信息可能已经有所发展或是发生改变。

    app.py

    import pdb;pdb.set_trace()
    app = 1
    import model
    #from model import User #ImportError: cannot import name 'User'
    print(app)
    print(model)
    #print(model.User) #AttributeError: module 'model' has no attribute 'User'
    

    model.py

    import pdb;pdb.set_trace()
    from app import app
    User = app + 1
    

    执行顺序

    $ python app.py
    > /tmp/demo/app.py(2)<module>()
    -> app = 1
    (Pdb) n
    > /tmp/demo/app.py(3)<module>()
    -> import model
    (Pdb) n
    > /tmp/demo/model.py(2)<module>()
    -> from app import app
    (Pdb) n
    > /tmp/demo/app.py(2)<module>()
    -> app = 1
    (Pdb) n
    > /tmp/demo/app.py(3)<module>()
    -> import model
    (Pdb) n
    > /tmp/demo/app.py(4)<module>()
    -> print(app)
    (Pdb) n
    1
    > /tmp/demo/app.py(5)<module>()
    -> print(model)
    (Pdb) n
    <module 'model' from '/tmp/demo/model.py'>
    --Return--
    > /tmp/demo/app.py(5)<module>()->None
    -> print(model)
    (Pdb) n
    --Return--
    > <frozen importlib._bootstrap>(222)_call_with_frames_removed()->None
    (Pdb) c
    1
    <module 'model' from '/tmp/demo/model.py'>
    

    回想自己学 Flask 的时候,也在这里被坑的好惨(前几天不长记性又被坑了一次)。
    这里有个很严重的问题,你需要小心翼翼地理清导入顺序,而且就算程序跑起来了, 某些模块可能执行了两次,造成意想不到的结果。
    解决方法是采用 Flask 最佳实践 https://zhuanlan.zhihu.com/p/22774028

    但是呢,这是 Python 的缺陷还是 Flask 的缺陷?
    我认为这是 Flask 的设计缺陷,@app.route看起来简单,全局对象用着一时爽, 但是非常容易产生循环依赖,一不小心就掉坑里了。

    目前尚无回复
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2227 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 16:01 · PVG 00:01 · LAX 08:01 · JFK 11:01
    ♥ Do have faith in what you're doing.