推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
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
guyskk
V2EX  ›  Python

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

  •  
  •   guyskk ·
    guyskk · Dec 3, 2016 · 4105 views
    This topic created in 3446 days ago, the information mentioned may be changed or developed.

    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看起来简单,全局对象用着一时爽, 但是非常容易产生循环依赖,一不小心就掉坑里了。

    No Comments Yet
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3311 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 58ms · UTC 00:31 · PVG 08:31 · LAX 17:31 · JFK 20:31
    ♥ Do have faith in what you're doing.