推荐学习书目
› 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 · Jul 23, 2019 · 4211 views
    This topic created in 2661 days ago, the information mentioned may be changed or developed.

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

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

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

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



    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5001 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 08:11 · PVG 16:11 · LAX 00:11 · JFK 03:11
    ♥ Do have faith in what you're doing.