繁体   English   中英

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

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

我的 Python package,有色,终于可以工作了。 但是,当我运行dir(tinted)时,包中存在core.pysequences.py文件! 我只想将 function tint包含在 package 中。

当前目录的 output dir(tinted)

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

所需目录的 output dir(tinted)

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

这是我第一次将 package 上传到 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__.py import后删除内部模块。 像这样:

from .core import tint
del core

然后:

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

然而,这并不常见。 即使是 Python 标准库中的包通常也不会删除这些类型的导入。 例如, logging包导入threading并将其留在那里。 虽然有时他们会清理一下。 就像copy模块, 它执行del types, weakref 所以也没有什么问题。

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

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

不确定这是否会破坏任何东西,但可以做到

"""Module Docstring"""

__all__ = [
    # Classes
    "Foo",
    # Functions
    "bar",
]
__ALL__ = dir() + __all__  # catch default module attributes.

# Imports go here

def __dir__() -> list[str]:
    return __ALL__

解释: dir(obj)尝试调用obj.__dir__() 模块也是对象,我们可以添加自定义__dir__方法。 使用这个设置,你应该得到

dir(module) = ['__all__', '__builtins__', '__cached__', '__doc__', 
'__file__', '__loader__', '__name__', '__package__', '__spec__',]

加上__all__中指定的任何内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM