gpt4 book ai didi

python - 子包和 __init__.py

转载 作者:行者123 更新时间:2023-12-05 00:59:47 25 4
gpt4 key购买 nike

所以,这是一组关于如何在包/子包中使用 __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,但这只会影响我理解的使用通配符的导入(所以只有 from my_package import *from my_package.my_sub_package import *)。

我可以通过放置来实现这一点

import my_package.module1
import my_package.my_sub_package

在 my_package/__init__.py 和

import my_package.my_sub_package.module2

在 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))

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

正在执行 from my_package.module1 import * in my_package/__init__.py 和 from my_package.my_sub_package.module2 import * in my_package/my_sub_package/__init__.py怎么做?我不喜欢使用通配符导入,但导入(真实)模块中定义的所有内容并将它们全部列出似乎是不切实际的冗长。

第三个(也是高度相关的)问题:避免在多个地方写包名

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

最佳答案

my_package/__init__.py 中,使用

from . import my_sub_package

等等
参见例如 NumPy 的 __init__.py,它有 from 。导入随机,并允许

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 和核心定义(函数、类等)都可用。

如果不确定如何做某事,或者某事是否是好的做法,请查看一些知名的库或包。这有助于获得一些有值(value)的见解。

关于python - 子包和 __init__.py,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52498113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com