子软件包和__init __。py

时间:2018-09-25 12:20:35

标签: python package-structuring

因此,这是有关如何在包/子包中使用__init__.py的一系列问题。我进行了搜索,但出乎意料的是,找不到合适的答案。

如果我具有以下结构(显然只是一个简化的示例):

my_package/
  __init__.py
  module1.py
  my_sub_package/
    __init__.py
    module2.py

module1.py的内容是

my_string = 'Hello'

module2.py的内容为

my_int = 42

第一个问题:默认情况下从一个包中导入多个模块

__ init__.py文件中应该包含什么?

我可以将它们保留为空,在这种情况下,import my_package并不会真正执行任何操作(显然,它会导入程序包,但该程序包实际上不包含任何内容)。显然,这很好,并且在大多数情况下会发生这种情况。

在这种情况下,我希望import my_package允许我使用my_package.module1.my_stringmy_package.my_sub_package.module2.my_int

我可以将__all__ = [ 'module1' ]添加到my_package / __ init__.py中,并将__all__ = [ 'module2' ]添加到my_package / my_sub_package / __ init__.py中,但这仅影响使用通配符的导入(据我所知(因此仅{{1 }}和from my_package import *

我可以通过放置

from my_package.my_sub_package import *

my_package / __ init__.py和

import my_package.module1
import my_package.my_sub_package

位于my_package / my_sub_package / __ init__.py中,但这是一个坏主意吗?当我在Python解释器(3.5.5)中执行此操作时,它将创建(看似)无限个my_package.my_package.my_package ....系列。

单独但高度相关的问题:使用模块来保持文件的合理大小

如果我希望能够执行以下操作

import my_package.my_sub_package.module2

即如果我实际上在每个软件包中都有很多模块,我想纯粹使用module1和module2将代码分成更小的可读性文件(显然,在这个琐碎的示例中并不适用,但是很容易)

在my_package / __ init__.py中执行import my_package print(my_package.my_string) print(str(my_package.my_sub_package.my_int)) 和在my_package / my_sub_package / __ init__.py中进行from my_package.module1 import *是一种合理的方法吗?我不喜欢使用通配符导入,但是导入(实际)模块中定义的所有内容并列出所有内容似乎不切实际。

第三个(也是高度相关的)问题:避免在多个位置写包裹名称

有没有一种方法可以实现上述目的而不必将软件包名称放入其中的源代码中?我问是因为如果我重命名了软件包,我想避免不得不在多个地方进行更改(同样,在这个简单的示例中,很简单,可以在现实中由IDE或脚本来完成,但是很高兴知道如何避免)。

1 个答案:

答案 0 :(得分:0)

my_package/__init__.py中,使用

from . import my_sub_package


例如,参见NumPy的__init__.py,它具有from . import random,并允许

import numpy as np
np.random.random

在单个软件包中导入通配符通常很常见,只要在导入的模块和子软件包中定义了__all__。 还是来自NumPy的__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

还要注意两条core导入行。这样numpy.core和核心定义(函数,类等)都可以使用。

如果不确定如何做某事或某事是否是一种好的做法,请查看一些知名的库或程序包。这可以帮助获得一些有价值的见解。