我发了一封信。 我的代码组织如下:
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
——><我怎样才能防止这种行为, 如果可能的话
任何修复都需要重新排列包内容。但这可能没问题,因为
modules
子包似乎不是主包的公共API的一部分(或者您不会试图从视图中隐藏它)一种修复方法是完全取消
modules
,或者将它包含的模块移动到主包中,或者将它们包含的代码内联到主包中的其他现有模块中。这显然会对整个包的组织造成相当广泛和破坏性的更改,因此可能不实用,但它会将modules
排除在包的dir
条目之外,因为它根本不存在更温和的修复方法是在
baseXtoY/__init__.py
文件的顶层编写__dir__
函数。它应该返回一个序列,其中包含在包上调用时dir
返回的属性名称。这肯定会解决您眼前的问题,但它可能会使以后的编码和调试工作更加复杂,因为您需要不断更新列表,并且您将无法轻松获得默认的dir
结果,以查看模块的全局命名空间中定义了哪些属性(尽管您仍然可以通过读取包的__dict__
来手动查找名称和值)第三个选项可能是将
modules
子包重命名为_modules
。默认情况下,带前导下划线的名称仍将包含在dir
的输出中,但前导下划线表明它们是私有实现细节,而不是API的正式部分(除非有文档另有说明)最后一个选择当然是什么也不做,只是接受这样一个事实,即
dir
向您的用户泄露了一些实现细节。无论如何,他们都将拥有包的文件,如果他们想调查包的内部,他们将能够找到细节,而不管dir
为你的模块的公共API编写好的文档,并让任何处理未记录内容的人自己进行调试相关问题 更多 >
编程相关推荐