关于__init__.py 的疑问

2019-07-23 09:42:15 +08:00
 304464743

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

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

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

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



这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/585284

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX