我使用一些具有子包和子模块的复杂包。我喜欢逐个模块地控制它。我使用了一个简单的包auto-all
,它使它变得容易(完全公开 - 我是作者)。
https://pypi.org/project/auto-all/
这是一个例子:
from auto_all import start_all, end_all
# Define some internal stuff
start_all(globals())
# Define some external stuff
end_all(globals())
我使用这种方法的原因主要是因为进口。正如alexis所提到的,您可以通过在对象名称前加上下划线来隐式地使事物私有化,但是这对于导入的对象可能会变得混乱或不切实际。考虑以下代码:
from pyspark.sql.session import SparkSession
如果这出现在您的模块中,那么您将隐含地使其SparkSession
可以从模块外部访问。另一种方法是在所有导入的项目前加上下划线,例如:
from pyspark.sql.session import SparkSession as _SparkSession
这也不理想,因此手动管理__all__
是(我知道)管理您在外部可用的内容的唯一方法。
您可以通过显式设置__all__
变量的内容(这是Python 方式)轻松地做到这一点,但是在管理大量对象时这可能会变得乏味,并且如果开发人员添加新对象并且不这样做也会导致问题通过添加到__all__
变量来公开它。这种类型的事情可能会通过代码审查。使用简单的辅助函数来管理变量内容使这更容易。