首页   注册   登录
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
V2EX  ›  Python

关于 Python 的导入

  •  
  •   alvy · 2018-04-12 15:01:09 +08:00 · 2622 次点击
    这是一个创建于 579 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在某个文件里需要用到 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
        1
    wizardforcel   2018-04-12 15:03:03 +08:00 via Android
    为啥要相互导入。。

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