所以,这是一组关于如何在包/子包中使用 __init__.py 的问题。我已经搜索过,但令人惊讶的是没有找到一个像样的答案。
如果我有以下结构(这显然只是一个简化的例子):
my_package/
__init__.py
module1.py
my_sub_package/
__init__.py
module2.py
Run Code Online (Sandbox Code Playgroud)
module1.py 的内容是
my_string = 'Hello'
Run Code Online (Sandbox Code Playgroud)
module2.py 的内容是
my_int = 42
Run Code Online (Sandbox Code Playgroud)
__init__.py 文件中应该有什么?
我可以将它们留空,在这种情况下,import my_package实际上什么都不做(显然它导入了包,但包实际上什么都不包含)。这显然很好,大多数情况下应该会发生什么。
在这种情况下,我想要的是import my_package允许我使用my_package.module1.my_string和my_package.my_sub_package.module2.my_int。
我可以添加__all__ = [ 'module1' ]到 my_package/__init__.py 和__all__ = [ 'module2' ]my_package/my_sub_package/__init__.py,但这只会影响使用我理解的通配符的导入(所以只有from my_package import *和from my_package.my_sub_package import *)。
我可以通过把
import my_package.module1
import my_package.my_sub_package
Run Code Online (Sandbox Code Playgroud)
在 my_package/__init__.py 和
import my_package.my_sub_package.module2
Run Code Online (Sandbox Code Playgroud)
在 my_package/my_sub_package/__init__.py 中,但这是个坏主意吗?当我在 Python 解释器 (3.5.5) 中执行此操作时,它会创建一个(看似)无限系列的 my_package.my_package.my_package....。
如果我想改为能够执行以下操作
import my_package
print(my_package.my_string)
print(str(my_package.my_sub_package.my_int))
Run Code Online (Sandbox Code Playgroud)
即我想使用 module1 和 module2 纯粹是为了将代码分离成更小的更易读的文件,如果我实际上在每个包中有很多模块(这显然不适用于这个简单的例子,但很容易)
是做from my_package.module1 import *在my_package / __ init__.py和from my_package.my_sub_package.module2 import *在my_package / my_sub_package / __ init__.py合理的方式做到这一点?我不喜欢使用通配符导入,但是导入(真实)模块中定义的所有内容并列出所有内容似乎是不切实际的冗长。
有没有一种方法可以实现上述目的而不必将包的名称放入其中的源代码中?我问是因为如果我重命名包,我想避免在多个地方更改它(同样,在这个简单的例子中很简单,实际上可以由 IDE 或脚本完成,但很高兴知道如何避免)。
在my_package/__init__.py,使用
from . import my_sub_package
Run Code Online (Sandbox Code Playgroud)
等。
参见例如 NumPy 的__init__.py,它具有from . import random,并允许
import numpy as np
np.random.random
Run Code Online (Sandbox Code Playgroud)
单个包中的通配符导入往往很常见,前提是您已__all__在从中导入的模块和子包中进行了定义。又是一个来自 NumPy's 的例子__init__.py,它有几个通配符导入。
这是其中的一部分__init__.py:
from . import core
from .core import *
from . import compat
from . import lib
from .lib import *
from . import linalg
from . import fft
from . import polynomial
from . import random
from . import ctypeslib
from . import ma
from . import matrixlib as _mat
from .matrixlib import *
from .compat import long
Run Code Online (Sandbox Code Playgroud)
还要注意两条core导入行。无论numpy.core和核心定义(函数,类等),然后可。
当不确定如何做某事或某事是否是好的做法时,请查看一些著名的库或包。这有助于获得一些有价值的见解。
| 归档时间: |
|
| 查看次数: |
1075 次 |
| 最近记录: |