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
SlipStupig
V2EX  ›  Python

无意发现的一个 python 的坑

  •  1
     
  •   SlipStupig · 2016-05-12 20:49:57 +08:00 · 7140 次点击
    这是一个创建于 2877 天前的主题,其中的信息可能已经有所发展或是发生改变。

    a.py

    
    from b import myfunc
    
    class Base:
        pass
    
    

    b.py

    
    from a import Base
    
    class myfunc(Base):
        pass
    
    
    然后就出现了 ImportError: Can't import A Base

    这是否能说明 python 不能包相互引呢?
    第 1 条附言  ·  2016-05-13 17:01:57 +08:00
    并没怪 python 不好,主要还是自己习惯不好,导致的
    35 条回复    2016-05-15 13:28:37 +08:00
    alphadog619
        1
    alphadog619  
       2016-05-12 20:55:50 +08:00
    两个.py 在同一个目录下吗?
    SourceMan
        2
    SourceMan  
       2016-05-12 20:56:50 +08:00 via iPhone
    循环引用?
    好吧,我只是前端
    pointer
        3
    pointer  
       2016-05-12 20:56:53 +08:00
    试了下可以哒,看看两个文件是否在同一目录下
    RIcter
        4
    RIcter  
       2016-05-12 21:00:09 +08:00
    不可以互相引用,不然就炸了
    est
        5
    est  
       2016-05-12 21:01:14 +08:00   ❤️ 1
    今天在 v 站上看到第二个尝试解决鸡生蛋蛋生鸡问题的帖子了。
    ElegantOfKing
        6
    ElegantOfKing  
       2016-05-12 21:13:53 +08:00
    @est 2333333
    太直接!
    Mark3K
        7
    Mark3K  
       2016-05-12 21:14:09 +08:00
    到使用的时候再导入就行了
    am241
        8
    am241  
       2016-05-12 21:15:33 +08:00   ❤️ 1
    python.exe: 无意发现的一个用户的坑
    SlipStupig
        9
    SlipStupig  
    OP
       2016-05-12 21:39:02 +08:00
    @pointer 光引用不行,还得继承
    MrEggNoodle
        10
    MrEggNoodle  
       2016-05-12 21:40:29 +08:00
    @est 神总结。
    clino
        11
    clino  
       2016-05-12 21:48:27 +08:00
    "from a import Base"是没办法了,但是"from b import myfunc"可以放到用到 myfunc 的函数体里去做
    fy
        12
    fy  
       2016-05-12 22:18:05 +08:00
    虽然这样做是不对的,但我还是忍不住手动滑稽一下
    mdzz
        13
    mdzz  
       2016-05-12 22:31:47 +08:00
    (特地登录来手动滑稽一下
    weyou
        14
    weyou  
       2016-05-12 23:09:02 +08:00
    不是坑, 但这种情况不要用 from ... import ... 直接 import ...即可

    a.py
    ------
    import b
    使用 b.myfunc

    b.py
    -----
    import a
    使用 a.Base
    Kilerd
        15
    Kilerd  
       2016-05-13 00:42:26 +08:00 via Android   ❤️ 2
    我是来吐槽的,你一个类起名 myfunc ,几个意思啊
    ericls
        16
    ericls  
       2016-05-13 01:01:27 +08:00
    文档里面对这种情况写得很清楚 不能循环引用
    SlipStupig
        17
    SlipStupig  
    OP
       2016-05-13 02:22:05 +08:00
    @Kilerd 我随便写一个你就相信了,哈哈哈哈,我要是写 myObject 你怎么理解呢
    Alexhex
        18
    Alexhex  
       2016-05-13 08:33:45 +08:00
    ryanking8215
        19
    ryanking8215  
       2016-05-13 08:54:42 +08:00
    《改善 Python 程序的 91 个建议》
    wizardoz
        20
    wizardoz  
       2016-05-13 09:11:08 +08:00
    但是我觉得这样循环引用在任何语言里面都是不科学的。
    romanticbao
        21
    romanticbao  
       2016-05-13 09:22:47 +08:00
    我认为这种循环引用,是一种灾难
    plqws
        22
    plqws  
       2016-05-13 10:35:58 +08:00
    然而 commonJS 可以
    janxin
        23
    janxin  
       2016-05-13 12:11:32 +08:00 via iPhone
    @plqws 趁机黑一波 js XD
    wayslog
        24
    wayslog  
       2016-05-13 12:44:05 +08:00
    Python: 又是一个用户的坑
    zhuf
        25
    zhuf  
       2016-05-13 13:51:00 +08:00
    这叫 坑 ?
    secondwtq
        26
    secondwtq  
       2016-05-13 14:02:22 +08:00
    @plqws CommonJS 比这还要坑吧

    不过就循环引用的表现来看,我觉得 CommonJS 和 Python 模块系统处理的方式差不多。
    twhphoenix
        27
    twhphoenix  
       2016-05-13 14:05:52 +08:00
    python : 这届用户不行
    LINEX
        28
    LINEX  
       2016-05-13 15:49:58 +08:00
    @twhphoenix 心疼题主 :)
    hwsdien
        29
    hwsdien  
       2016-05-13 17:33:10 +08:00
    这届 Python 用户不行
    WKPlus
        30
    WKPlus  
       2016-05-13 20:59:00 +08:00
    @weyou 你确定你这种方式可以?

    python 循环 import 不会导致死循环,但是可能会导致看起来 import 了空 module
    sizeoftank
        31
    sizeoftank  
       2016-05-14 04:33:25 +08:00
    python a.py
    => 跑去执行 from b import myfunc 的时候
    解释器中 模块 a 里的 Base 还没被创建
    Hackathon
        32
    Hackathon  
       2016-05-14 13:46:06 +08:00   ❤️ 2
    a.py

    # -*- coding: utf-8 -*-

    def minus(a, b):
    return a - b

    if __name__ == '__main__':
    from b import add
    print add(1, 2)


    b.py

    # -*- coding: utf-8 -*-

    def add(a, b):
    return a + b

    if __name__ == '__main__':
    from a import minus
    print minus(2, 1)


    exec

    $ python a.py
    3
    $ python b.py
    1


    https://xxx-cook-book.gitbooks.io/python-cook-book/content/Import/CircularImports.html
    SlipStupig
        33
    SlipStupig  
    OP
       2016-05-15 12:14:57 +08:00
    @Hackathon 需要继承啊
    codeface
        34
    codeface  
       2016-05-15 12:47:37 +08:00
    醉了,这也怪 python 。。。
    SlipStupig
        35
    SlipStupig  
    OP
       2016-05-15 13:28:37 +08:00
    @codeface 都说了是习惯问题导致的,现在浅阅读的人越来越多了!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1342 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:33 · PVG 07:33 · LAX 16:33 · JFK 19:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.