[英]How to hide internal modules in a package's namespace?
我的 Python package,有色,终于可以工作了。 但是,当我运行dir(tinted)
时,包中存在core.py
和sequences.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.