Python "private" 函数编码规范

17 浏览
0 Comments

Python "private" 函数编码规范

在编写Python模块和其中的函数时,我有一些“公共”函数,这些函数应该向外部暴露,但还有一些“私有”函数,只应在内部使用和查看。\n我知道在Python中没有绝对的私有函数。但是,有什么是最好的、最整洁的或最常用的样式来区分“公共”函数和“私有”函数呢?\n我列出了我所知道的一些样式:\n1. 在模块文件中使用`__all__`来指示其“公共”函数(参考链接:What\'s the python __all__ module level variable for?)\n2. 在“私有”函数的名称前使用下划线\n还有其他人们使用的想法或约定吗?\n非常感谢!

0
0 Comments

Python编程中存在一个问题,即没有真正的私有实例变量,无法在对象外部访问。然而,大多数Python代码遵循一个约定:以下划线开头的名称(例如_spam)应该被视为API的非公共部分(无论是函数、方法还是数据成员)。这应该被视为实现细节,可能随时更改而不另行通知。

由于存在类私有成员的合法用例(即避免与子类定义的名称冲突),因此有了一种名为名称改编的有限支持机制。形如__spam的标识符(至少两个前导下划线,最多一个尾随下划线)会在文本上被替换为_classname__spam,其中classname是当前类名去除前导下划线后的结果。这种改编是在不考虑标识符的句法位置的情况下进行的,只要它出现在类的定义中即可。

通常人们会使用前导下划线来区分模块中的“公共”和“私有”函数。大多数情况下如此。正如文档所说,这是一种约定,你仍然可以像公共函数一样访问这些函数,但“正确”的做法是假装它们并不存在。

这个约定适用于非基于类的函数吗?我认为它应该适用于任何你不希望被视为脚本公共接口的函数。

这不是一个好答案。问题是关于模块中的函数而不是类中的方法,使用__作为私有(内部)函数的前缀存在严重问题。如果在一个模块中定义了一个内部函数__foo()并在该模块中的类A中调用它,将会出现错误NameError: name '_A__foo' is not defined。

Python 3文档仍然是同样的说法:docs.python.org/3/tutorial/classes.html#tut-private

0