干净地导入自定义模块

时间:2017-08-19 06:28:06

标签: python-3.x

我想从子模块导入一个类,而不必使用from submodule.submodule import Class语法。相反,我只想像普通的Python3模块一样from submodule import Class

我觉得应该已经回答了一百万次,虽然在SO上有几个类似命名的问题,但它们都没有提供一个简单明了的简单解决方案。

我尝试使用此设置进行最简单的测试:

.
├── main.py
└── test
    ├── __init__.py
    └── test.py

在我的test模块中,我有以下内容:

test.py

class Test:
    def __init__(self):
        print('hello')

__初始化__。PY

from test import Test
__all__ = ['Test']

在上层 main.py 中,我有以下内容:

from test import Test
Test()

当我尝试运行main.py时,我得到:

ImportError: cannot import name 'Test'

我知道我可以用main.py替换from test.test import Test中的import语句,但我的理解是__init__.py的一个要点是在包级别上访问子模块(使用__all__允许使用from test import *

导入所有内容

1 个答案:

答案 0 :(得分:1)

根据PEP 404

  

在Python 3中,包中的隐式相对导入不再存在   可用 - 仅限绝对导入和显式相对导入   支持的。此外,星级导入(例如来自x import *)仅是   在模块级代码中允许。

如果您将__init__.py更改为:

from test.test import Test
__all__ = ['Test']

然后您的代码可以运行:

$ python3 main.py
hello

但现在它仅适用于python3(原始代码仅适用于python2)。
要使代码适用于python的两行,我们必须使用显式相对导入

from .test import Test
__all__ = ['Test']

代码执行:

$ python2 main.py 
hello
$ python3 main.py 
hello