Python“私有”函数编码约定


74

在编写python模块及其中的函数时,我有一些“公开”函数应该向外界公开,但还有一些其他“私有”函数只能在本地和内部查看和使用。

我了解在python中没有绝对私有函数。但是,区分“公共”功能和“私人”功能的最佳,最简洁或最常用的样式是什么?

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

  1. __all__在模块文件中使用以指示其“公共”功能(python __all__模块级别变量的作用是什么?
  2. 在“私有”函数名称的开头使用下划线

人们还有其他想法或约定吗?

非常感谢你!

Answers:


103

从Python的Class模块文档中:

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

由于存在类专用成员的有效用例(即避免名称与子类定义的名称发生名称冲突),因此对这种称为名称处理的机制的支持有限。形式为__spam的任何标识符(至少两个前导下划线,至多一个下划线)在文本上被_classname__spam替换,其中classname是当前类名,前导下划线被去除。只要不存在标识符的语法位置,就可以进行这种改写,只要它出现在类的定义内即可。


4
谢谢!因此,通常人们会使用下划线来区分模块中的“公共”和“私人”功能吗?
Kaifei

13
大多。就像文档中所说的那样,这是一个约定,您仍然可以像访问公共函数一样访问它们,但是“正确”的处理方式是假装它们实际上不存在。
埃里克·海德里克

此约定是否适用于不基于类的函数?
radtek

4
@radtek我想说它应该适用于您不想被视为该脚本的公共合同的一部分的任何功能。
埃里克·海德里克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.