有没有必要设置__all__然后使用前导下划线?

时间:2015-02-17 22:55:53

标签: python cpython

我一直在阅读cpython HTTP包的源代码,以获得乐趣和利润,并注意到在server.py中他们设置了__all__变量,但也使用了函数的前导下划线{ {1}}。

这不是多余的吗?不要用来限制_quote_html(html)导入的内容吗?

为什么他们两个都这样做?

3 个答案:

答案 0 :(得分:4)

在执行__all__时,

from HTTP import *确实是一个限制;在函数或方法的名称前加_前缀是一种约定,用于通知用户该项应被视为私有,因此自行承担风险。

答案 1 :(得分:3)

除了"按惯例私有" _leading_underscores的功能之外,还有:

  • 相当多的import名称;
  • 四个班级名称;
  • 三个函数名称​​没有前导下划线;
  • 两个字符串"常量" ;和
  • 一个局部变量(nobody)。

如果__all__未定义为仅涵盖类,则所有这些内容也将通过通配符from server import *添加到您的命名空间中。

是的,您可以使用一种方法或另一种方法,但我认为领先的下划线比__all__的排除更强;后者说"你可能经常不会需要这个" ,前者说"除非你知道你在做什么&不做什么#34; 。他们都有自己的位置。

答案 2 :(得分:1)

这主要是一个文档,与评论类似。一个前导下划线更清楚地表明一个人阅读代码特定功能或变量不属于公共API,而不是让那个人针对__all__检查每个名称。 PEP8明确建议以这种方式使用这两种约定:

  

为了更好地支持内省,模块应该明确声明   使用__all__属性在其公共API中的名称。设置   __all__到空列表表示该模块没有公共API。

     

即使__all__设置得恰当,内部接口(包,   应该仍然是模块,类,函数,属性或其他名称   以单个前导下划线为前缀。