我使用的是Python 3.5.1.我在这里阅读了文档和包裹部分:https://docs.python.org/3/tutorial/modules.html#packages

现在,我有以下 struct :

/home/wujek/Playground/a/b/module.py

module.py:

class Foo:
    def __init__(self):
        print('initializing Foo')

现在,在/home/wujek/Playground岁的时候:

~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>

同样,现在在家里,Playground岁的超级富豪:

~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>

实际上,我可以做各种各样的事情:

~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b

为什么会这样?我认为ab中都需要__init__.py个文件(空的就可以了),当Python路径指向Playground文件夹时,module.py才能被导入?

这似乎与Python 2.7有所不同:

~ $ PYTHONPATH=Playground python
>>> import a
ImportError: No module named a
>>> import a.b
ImportError: No module named a.b
>>> import a.b.module
ImportError: No module named a.b.module

~/Playground/a~/Playground/a/b中都有__init__.py,效果很好.

推荐答案

Python3.3+有Implicit Namespace Packages个包,允许它创建一个没有__init__.py文件的包.

允许隐式名称空间包意味着提供__init__.py个文件can be dropped completely和受影响.的要求.

包含__init__.py个文件的旧方法仍然像在Python2中一样工作.

Python相关问答推荐

根据另一列中的nan重置值后重新加权Pandas列

将两只Pandas rame乘以指数

基于索引值的Pandas DataFrame条件填充

如何从数据库上传数据到html?

Pandas—在数据透视表中占总数的百分比

Asyncio:如何从子进程中读取stdout?

什么是最好的方法来切割一个相框到一个面具的第一个实例?

索引到 torch 张量,沿轴具有可变长度索引

Polars map_使用多处理对UDF进行批处理

根据客户端是否正在传输响应来更改基于Flask的API的行为

如何强制向量中的特定元素在Gekko中处于优化解决方案中

当HTTP 201响应包含 Big Data 的POST请求时,应该是什么?  

Regex用于匹配Python中逗号分隔的AWS区域

TypeError:';Locator';对象无法在PlayWriter中使用.first()调用

随机森林n_估计器的计算

以极轴表示的行数表达式?

.awk文件可以使用子进程执行吗?

通过对列的其余部分进行采样,在Polars DataFrame中填充_null`?

极地数据帧:ROLING_SUM向前看

从`end_date`回溯,如何计算以极为单位的滚动统计量?