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

关于__init__.py 的疑问

  •  
  •   304464743 · 2019-07-23 09:42:15 +08:00 · 3054 次点击
    这是一个创建于 1958 天前的主题,其中的信息可能已经有所发展或是发生改变。

    init.py 是在里面写__all__=[""]用来导入包的,函数或类写在同一个包的其他文件里。 但我看了 django 的源码,他有些包,会把一些函数或者类也写在__init__.py 所以我想问,把函数或者类写在__init__.py 有什么特殊含义或者用法么?

    18 条回复    2019-07-26 21:27:29 +08:00
    Etuloser
        1
    Etuloser  
       2019-07-23 09:51:49 +08:00
    你在导入这个模块的时候 实际是在导入 __init__.py 文件
    HelloAmadeus
        2
    HelloAmadeus  
       2019-07-23 09:52:08 +08:00 via iPhone
    没有,而且不推荐这样做。和普通.py 文件的唯一区别就是导入路径
    tabris17
        3
    tabris17  
       2019-07-23 09:53:49 +08:00
    没有特殊含义

    用 __all__ 导出仅仅是针对 from xxx import * 而已
    dinjufen
        4
    dinjufen  
       2019-07-23 10:00:51 +08:00
    一个文件夹包含__init__.py 就成了 Python 包,可以用 import、from... import ...导入
    Vegetable
        5
    Vegetable  
       2019-07-23 10:01:39 +08:00
    没什么特殊的含义。
    同样不建议在这里边写代码,不好组织代码。容易出现交叉引用的情况。
    secsilm
        6
    secsilm  
       2019-07-23 10:02:41 +08:00
    __init__.py 在 python3 里已经不需要了
    chaleaochexist
        7
    chaleaochexist  
       2019-07-23 10:28:57 +08:00
    @secsilm 有说明链接吗?

    @lz
    就是为了在导入的时候省事儿.
    hmxxmh
        8
    hmxxmh  
       2019-07-23 10:31:04 +08:00
    模块与包的区别,新建一个文件夹有 init 的就是包,你可以在新建的时候选择 package 看下
    chaleaochexist
        9
    chaleaochexist  
       2019-07-23 10:32:57 +08:00
    @secsilm 找到了谢谢.
    secsilm
        10
    secsilm  
       2019-07-23 10:54:00 +08:00   ❤️ 1
    @secsilm 严格来说是 Python 3.3 之后空的 __init__. py 不需要了。见 [PEP 420]( https://www.python.org/dev/peps/pep-0420/)
    frostming
        11
    frostming  
       2019-07-26 07:50:08 +08:00
    @secsilm 你可能理解错了 PEP 420
    secsilm
        12
    secsilm  
       2019-07-26 09:58:59 +08:00
    @frostming 如何说?
    frostming
        13
    frostming  
       2019-07-26 11:43:57 +08:00
    @secsilm 整个 PEP 明明讨论的是 Namespace package,并不影响普通 package
    secsilm
        14
    secsilm  
       2019-07-26 13:18:28 +08:00
    @frostming 我感觉我说的那句没问题,有了 namespace packages,空的 __init__.py 确实不需要了。但如果在某文件夹发现了 __init__py,仍然会当作是 regular package ( 3.2 及之前版本实现的 package )。
    frostming
        15
    frostming  
       2019-07-26 15:19:34 +08:00
    @secsilm Namespace package 是 python 包分发的概念,这个 package 是代码组织的概念,无论是不是 3.2 以后都是要__init__.py ,不然你都 import 不了
    secsilm
        16
    secsilm  
       2019-07-26 16:14:38 +08:00 via Android
    @frostming 实际上是能 import 的,A 目录下有个 B.py ,在 A 同级目录下是能够 import A.B 的,我一直这么写的,Python3.6
    frostming
        17
    frostming  
       2019-07-26 20:37:40 +08:00
    @secsilm 不能,Python 3.7.4

    Traceback (most recent call last):
    File "c.py", line 1, in <module>
    import a.b
    ModuleNotFoundError: No module named 'a'
    secsilm
        18
    secsilm  
       2019-07-26 21:27:29 +08:00
    @frostming 我这里可以,Python 3.6.8 和 3.7.3



    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2602 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 03:42 · PVG 11:42 · LAX 19:42 · JFK 22:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.