V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 · 2018-04-12 15:01:09 +08:00 · 3692 次点击
    这是一个创建于 2453 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在某个文件里需要用到 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的错

    那么应该怎么导入呢?

    第 1 条附言  ·  2018-04-12 19:40:01 +08:00

    我的总结是

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

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