Python“私有”函数编码约定

Posted

技术标签:

【中文标题】Python“私有”函数编码约定【英文标题】:Python "private" function coding convention 【发布时间】:2013-02-09 10:12:10 【问题描述】:

在编写 python 模块和其中的函数时,我有一些应该公开给外部人员的“公共”函数,但还有一些只应该在本地和内部看到和使用的其他“私有”函数。

我知道在 python 中没有绝对的私有函数。但是,区分“公共”功能和“私有”功能的最佳、最简洁或最常用的风格是什么?

我列出了一些我知道的样式:

    在模块文件中使用__all__ 表示其“公共”功能 (What's the python __all__ module level variable for?) 在“私有”函数名称的开头使用下划线

还有其他人们使用的想法或惯例吗?

非常感谢!

【问题讨论】:

我有同样的问题,这里的答案不适合我。我知道 _ 用于私有函数,但我有函数,在它的本地命名空间之外使用(不是私有的),但只在我的模块内部使用,不应该用于公共 API。有什么推荐的方法吗? 【参考方案1】:

来自 Python 的 Class 模块文档:

在 Python 中不存在只能从对象内部访问的“私有”实例变量。但是,大多数 Python 代码都遵循一个约定:前缀为下划线的名称(例如 _spam)应被视为 API 的非公共部分(无论是函数、方法还是数据成员) .它应被视为实现细节,如有更改,恕不另行通知。

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

【讨论】:

谢谢!所以通常人们只会使用前导下划线来区分模块中的“公共”和“私有”功能? 主要是。就像文档说的那样,这是一个约定,您仍然可以访问这些函数,就像它们是公共的一样,但是“正确”的做事方式是假装它们并不真的存在。 此约定是否适用于非基于类的函数? @radtek 我想说它应该适用于您不想被视为该脚本公共合同一部分的任何功能。

以上是关于Python“私有”函数编码约定的主要内容,如果未能解决你的问题,请参考以下文章

python中带有下划线的变量和函数

以一个下划线开头的PHP函数名称[重复]

Python 函数前的下划线

Python 函数前的下划线

Python编码规范

python的继承