Python“私有”函数编码规范

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

我有同样的问题,这里的答案不适用于我。我知道 _ 用于私有函数,但是我有一些函数,它们在本地命名空间之外被使用(不是私有的),但仅在我的模块内部使用,并且不应该作为公共 API。是否有任何推荐的方法? - Daniel Malachov
1个回答

139

来自Python的Class模块文档:

在Python中,无法从对象外部访问的“私有”实例变量不存在。但是,大多数Python代码都遵循一种约定:以下划线为前缀的名称(例如_spam)应视为API的非公共部分(无论它是函数、方法还是数据成员)。它应该被视为实现细节,并且可能会在不事先通知的情况下更改。

由于存在使用类私有成员的有效用例(即避免与子类定义的名称发生名称冲突),因此有对这种机制的有限支持,称为名称修饰。任何形式为__spam的标识符(至少两个前导下划线,最多一个尾随下划线)都会在文本上替换为_classname__spam,其中classname是当前类名,前导下划线已被剥离。只要它出现在类的定义内部,就会进行这种名称修饰,而不考虑标识符的语法位置。


4
谢谢!一般人们会在模块中使用前导下划线来区分“公共”和“私有”函数,对吗? - Kaifei
16
大部分情况下,就像文档所说,这是一种惯例。你仍然可以像访问公共函数一样访问它们,但“正确”的做法是假装它们并不存在。 - Eric Hydrick
2
这个约定适用于非基于类的函数吗? - radtek
4
@radtek 我认为这适用于任何您不希望被视为该脚本公共合同一部分的功能。 - Eric Hydrick
1
这不是一个好的答案。问题是关于模块中的函数而不是类中的方法,而且在使用__作为私有(内部)函数前缀时存在严重问题。如果我们在模块中定义一个内部函数__foo()并从该模块中的类A中调用它,我们将得到错误NameError:name '_A__foo' is not defined - Number47
Python 3文档仍然说同样的事情:https://docs.python.org/3/tutorial/classes.html#tut-private - dijonkitchen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接