__“导入模块名称”的所有等效项`

2024-10-03 19:29:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我发了一封信。 我的代码组织如下:

sh-5.1$ tree
.
├── LICENSE
├── README.md
├── baseXtoY
│   ├── __init__.py
│   ├── __main__.py
│   └── modules
│       ├── __init__.py
│       └── number.py
├── dist
│   ├── baseXtoY-0.4-py3-none-any.whl
│   └── baseXtoY-0.4.tar.gz
└── setup.py

3 directories, 9 files
sh-5.1$ more baseXtoY/__init__.py 
from .modules import baseXtoY, license
__all__ = ['baseXtoY', 'license']
sh-5.1$ 

发行

当我导入时:

>>> import baseXtoY
>>> dir(baseXtoY)
['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'baseXtoY', 'license', 'modules']

有一个模块baseXtoY.modules

——><我怎样才能防止这种行为, 如果可能的话


Tags: 代码pyimportmodulestreenumberinitlicense
1条回答
网友
1楼 · 发布于 2024-10-03 19:29:41

任何修复都需要重新排列包内容。但这可能没问题,因为modules子包似乎不是主包的公共API的一部分(或者您不会试图从视图中隐藏它)

一种修复方法是完全取消modules,或者将它包含的模块移动到主包中,或者将它们包含的代码内联到主包中的其他现有模块中。这显然会对整个包的组织造成相当广泛和破坏性的更改,因此可能不实用,但它会将modules排除在包的dir条目之外,因为它根本不存在

更温和的修复方法是在baseXtoY/__init__.py文件的顶层编写__dir__函数。它应该返回一个序列,其中包含在包上调用时dir返回的属性名称。这肯定会解决您眼前的问题,但它可能会使以后的编码和调试工作更加复杂,因为您需要不断更新列表,并且您将无法轻松获得默认的dir结果,以查看模块的全局命名空间中定义了哪些属性(尽管您仍然可以通过读取包的__dict__来手动查找名称和值)

第三个选项可能是将modules子包重命名为_modules。默认情况下,带前导下划线的名称仍将包含在dir的输出中,但前导下划线表明它们是私有实现细节,而不是API的正式部分(除非有文档另有说明)

最后一个选择当然是什么也不做,只是接受这样一个事实,即dir向您的用户泄露了一些实现细节。无论如何,他们都将拥有包的文件,如果他们想调查包的内部,他们将能够找到细节,而不管dir为你的模块的公共API编写好的文档,并让任何处理未记录内容的人自己进行调试

相关问题 更多 >