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

无意发现的一个 python 的坑

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

    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
        1
    alphadog619   2016-05-12 20:55:50 +08:00
    两个.py 在同一个目录下吗?
        2
    SourceMan   2016-05-12 20:56:50 +08:00 via iPhone
    循环引用?
    好吧,我只是前端
        3
    pointer   2016-05-12 20:56:53 +08:00
    试了下可以哒,看看两个文件是否在同一目录下
        4
    RIcter   2016-05-12 21:00:09 +08:00
    不可以互相引用,不然就炸了
        5
    est   2016-05-12 21:01:14 +08:00   ♥ 1
    今天在 v 站上看到第二个尝试解决鸡生蛋蛋生鸡问题的帖子了。
        6
    ElegantOfKing   2016-05-12 21:13:53 +08:00
    @est 2333333
    太直接!
        7
    Mark3K   2016-05-12 21:14:09 +08:00
    到使用的时候再导入就行了
        8
    am241   2016-05-12 21:15:33 +08:00   ♥ 1
    python.exe: 无意发现的一个用户的坑
        9
    SlipStupig   2016-05-12 21:39:02 +08:00
    @pointer 光引用不行,还得继承
        10
    MrEggNoodle   2016-05-12 21:40:29 +08:00
    @est 神总结。
        11
    clino   2016-05-12 21:48:27 +08:00
    "from a import Base"是没办法了,但是"from b import myfunc"可以放到用到 myfunc 的函数体里去做
        12
    fy   2016-05-12 22:18:05 +08:00
    虽然这样做是不对的,但我还是忍不住手动滑稽一下
        13
    mdzz   2016-05-12 22:31:47 +08:00
    (特地登录来手动滑稽一下
        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
        15
    Kilerd   2016-05-13 00:42:26 +08:00 via Android   ♥ 2
    我是来吐槽的,你一个类起名 myfunc ,几个意思啊
        16
    ericls   2016-05-13 01:01:27 +08:00
    文档里面对这种情况写得很清楚 不能循环引用
        17
    SlipStupig   2016-05-13 02:22:05 +08:00
    @Kilerd 我随便写一个你就相信了,哈哈哈哈,我要是写 myObject 你怎么理解呢
        18
    Alexhex   2016-05-13 08:33:45 +08:00
        19
    ryanking8215   2016-05-13 08:54:42 +08:00
    《改善 Python 程序的 91 个建议》
        20
    wizardoz   2016-05-13 09:11:08 +08:00
    但是我觉得这样循环引用在任何语言里面都是不科学的。
        21
    romanticbao   2016-05-13 09:22:47 +08:00
    我认为这种循环引用,是一种灾难
        22
    plqws   2016-05-13 10:35:58 +08:00
    然而 commonJS 可以
        23
    janxin   2016-05-13 12:11:32 +08:00 via iPhone
    @plqws 趁机黑一波 js XD
        24
    wayslog   2016-05-13 12:44:05 +08:00
    Python: 又是一个用户的坑
        25
    zhuf   2016-05-13 13:51:00 +08:00
    这叫 坑 ?
        26
    secondwtq   2016-05-13 14:02:22 +08:00
    @plqws CommonJS 比这还要坑吧

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

    python 循环 import 不会导致死循环,但是可能会导致看起来 import 了空 module
        31
    sizeoftank   2016-05-14 04:33:25 +08:00
    python a.py
    => 跑去执行 from b import myfunc 的时候
    解释器中 模块 a 里的 Base 还没被创建
        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
        33
    SlipStupig   2016-05-15 12:14:57 +08:00
    @Hackathon 需要继承啊
        34
    codeface   2016-05-15 12:47:37 +08:00
    醉了,这也怪 python 。。。
        35
    SlipStupig   2016-05-15 13:28:37 +08:00
    @codeface 都说了是习惯问题导致的,现在浅阅读的人越来越多了!
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4522 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 06:10 · PVG 14:10 · LAX 22:10 · JFK 01:10
    ♥ Do have faith in what you're doing.