如何在包的命名空间中隐藏内部模块?
How to hide internal modules in a package's namespace?
我的 Python 包 tinted 终于可以用了。但是,当我运行dir(tinted)
时,包中存在core.py
和sequences.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__.py
中 import
之后的内部模块。像这样:
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'>
我的 Python 包 tinted 终于可以用了。但是,当我运行dir(tinted)
时,包中存在core.py
和sequences.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__.py
中 import
之后的内部模块。像这样:
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'>