推荐学习书目
› 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
alvy
V2EX  ›  Python

关于 Python 的导入

  •  
  •   alvy · Apr 12, 2018 · 5073 views
    This topic created in 3126 days ago, the information mentioned may be changed or developed.

    我在某个文件里需要用到 contract.serializers.contract_serializers 里的 PurchaseSerializer
    那么我有两种写法:

    import contract.serializers.contract_serializers
    a = contract.serializers.contract_serializers.PurchaseSerializer(instance)
    

    这一种层级太长了,写起来很不方便

    from contract.serializers.contract_serializers import PurchaseSerializer
    a = PurchaseSerializer(instance)
    

    这一种写法看着很好
    但是我有个疑问是:在[编写高质量代码:改善 Python 程序的 91 个建议](编写高质量代码:改善 Python 程序的 91 个建议)这本书里,提到了:要有节制的使用from ... import ...
    而且如果两个文件有相互导入,使用from ... import ...大概率会报import error的错

    那么应该怎么导入呢?

    Supplement 1  ·  Apr 12, 2018

    我的总结是

    1. 尽量避免循环导入
    2. 路径太深的导入用from...import...
    3. 如果存在循环导入且暂时无法解决,那么把from...import...放在函数里
    20 replies  •  2018-04-13 10:45:23 +08:00
    wizardforcel
    wizardforcel
    Apr 12, 2018 via Android
    1
    为啥要相互导入。。

    你见过哪个语言允许相互导入?
    yeyuexia
    yeyuexia
    Apr 12, 2018
    2
    好几个月没写 python 了,现在如果两个文件有相互导入 用 import 就不会报 import error 的错了????????????????
    a33486
    a33486
    Apr 12, 2018
    3
    有种导入方法叫__important__("contract.serializers.contract_serializers").PurchaseSerializer 可以试一试 这种导入方法模块和函数全部要自己打比较麻烦 而且只能导入一次 我现在刚入门 在想这种导入方法跟 from important 之间的性能区别呢
    takato
    takato
    Apr 12, 2018
    4
    import contract.serializers.contract_serializers as ooxx
    a = ooxx.PurchaseSerializer(instance)
    yeyuexia
    yeyuexia
    Apr 12, 2018
    5
    233 刚才查了下 还真可以,我还真是太无知了哈哈哈
    alvy
    alvy
    OP
    Apr 12, 2018
    6
    @wizardforcel 相互导入是不对,但是实际情况的确会遇到
    alvy
    alvy
    OP
    Apr 12, 2018
    7
    @takato 这样导入如果是相互导入的话也会报错,因为 as 会执行,然后就报错了
    takato
    takato
    Apr 12, 2018
    8
    @alvy 循环导入是要从代码结构上解决的问题哦。。
    ipwx
    ipwx
    Apr 12, 2018
    9
    在函数或者类成员函数里面导入,是可以突破循环导入的限制的。
    bookding0
    bookding0
    Apr 12, 2018
    10
    用 from xx import xx。
    循环导入是另一个问题。
    alvy
    alvy
    OP
    Apr 12, 2018
    11
    @ipwx 没错,但是我就要在顶部导入呢
    scriptB0y
    scriptB0y
    Apr 12, 2018❤️1
    12
    如果实际情况出现,只能说明项目的设计有问题,换任何语言都有问题。
    gnozix
    gnozix
    Apr 12, 2018
    13
    import as 了解一下
    Akikiki
    Akikiki
    Apr 12, 2018
    14
    @yeyuexia flask 相互导入的好像比较常见
    wizardoz
    wizardoz
    Apr 12, 2018
    15
    用的地方再导入,就基本上不存在循环导入的问题。
    noai
    noai
    Apr 12, 2018
    16
    @wizardoz 嗯嗯
    ox180
    ox180
    Apr 12, 2018
    17
    @Akikiki 你举个例子
    Wicked
    Wicked
    Apr 12, 2018 via iPhone
    18
    import as
    wqzjk393
    wqzjk393
    Apr 13, 2018 via iPhone
    19
    …刚好今天看 flask 讲到分文件导致的注册路由模块和主模块之间的循环导入,然后使用蓝本解决 23333
    kysida
    kysida
    Apr 13, 2018
    20
    试试 import from as ????
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5242 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 03:19 · PVG 11:19 · LAX 19:19 · JFK 22:19
    ♥ Do have faith in what you're doing.