如何在包的命名空间中隐藏内部模块?

How to hide internal modules in a package's namespace?

我的 Python 包 tinted 终于可以用了。但是,当我运行dir(tinted)时,包中存在core.pysequences.py文件!我只希望函数 tint 包含在程序包中。

dir(tinted)的当前输出:

['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', 'core', 'sequences', 'tint']

dir(tinted) 的期望输出:

['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', 'tint']

第一次向PyPi上传包,如有不妥之处还请见谅

有人知道如何解决这个问题吗?

假设您的 Python 包位于名为 tinted 的文件夹中。您在该文件夹内的模块 core.py 中定义了一个名为 tint 的函数。但是您想在包的命名空间的顶层公开该函数。这是重要功能的好习惯,它们应该在顶层。

然后在 __init__.py 你会得到这个:

from .core import tint

(或者 from tinted.core import tint 如果您碰巧使用绝对导入。)

但是,正如您所注意到的,这也会将 core 模块放入包的顶级命名空间中:

>>> import tinted
>>> dir(tinted)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__',
'__name__', '__package__', '__path__', '__spec__', 'core', 'tint']

如果您想保持该命名空间干净利落,您可以删除 __init__.pyimport 之后的内部模块。像这样:

from .core import tint
del core

然后:

>>> dir(tinted)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__',
'__name__', '__package__', '__path__', '__spec__', 'tint']

然而,这并不常见。即使是 Python 的标准库中的包通常也不会删除这些类型的导入。例如,末尾的 logging package imports threading and just leaves it there. Though sometimes they do clean up a bit. Like the copy module, which does del types, weakref。所以也没什么问题。

在这种情况下,对象是一个函数。请注意,当它是 class 时,您无论如何都不能完全隐藏包结构。考虑来自流行 Pandas 库的这个例子:

>>> import pandas
>>> pandas.DataFrame
<class 'pandas.core.frame.DataFrame'>