我一直在阅读cpython HTTP包的源代码,以获得乐趣和利润,并注意到在server.py中他们设置了__all__
变量,但也使用了函数的前导下划线{ {1}}。
这不是多余的吗?不要用来限制_quote_html(html)
导入的内容吗?
为什么他们两个都这样做?
答案 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__
设置得恰当,内部接口(包, 应该仍然是模块,类,函数,属性或其他名称 以单个前导下划线为前缀。