【问题标题】:How to hide internal modules in a package's namespace?如何在包的命名空间中隐藏内部模块?
【发布时间】:2021-12-23 11:51:29
【问题描述】:

我的 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,如果我做错了什么,请原谅我。

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

【问题讨论】:

  • 如果你需要一个来自“core.py”的函数,那么“core.py”必须包含在pip包中(通常是一个轮子文件)。 “dir”返回 Python 包的内容(如果应用于其中)。这是另一回事。
  • @MichaelButscher 你能澄清一下吗?
  • 一个 pip 包/wheel 文件包含在用户的 Python 安装中要安装的文件以及附加信息和命令,例如。 G。编译 C 代码。 Python 包是模块和/或其他 Python 包的集合。通常它表示为包含文件和/或其他文件夹的文件系统文件夹。
  • @MichaelButscher 谢谢!不过,有什么方法可以更改包以隐藏这些文件?
  • 仅供参考:您的 github 链接无效。

标签: python pip pypi


【解决方案1】:

假设您的 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 并将其留在那里。虽然有时他们确实会清理一下。就像copy 模块一样,最后是which does del types, weakref。所以也没什么不好。

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

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

【讨论】:

  • 这很有帮助,谢谢!
  • 我注意到我的包的一件事是您仍然可以使用点符号访问coresequences,但是它们隐藏在命名空间中。我想那是因为它更“pythonic”。
  • 这就是导入机制的工作原理。就像您可以执行 from pandas import core 一样,即使您从未导入过 pandas。导入机制查找实际文件,它不关心命名空间。
猜你喜欢
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多