关于 Python 的导入 - V2EX
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 4057 次点击
    这是一个创建于 2740 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在某个文件里需要用到 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  
       201-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     Solana     2692 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 07:23 PVG 15:23 LAX 00:23 JFK 03:23
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86