4
def __f():
  print 1

def _f():
  print 1

我尝试了 import 并且可以访问:

>>> import test1
>>> test1._f()
1

这有什么意义吗?我想写一些不是基于类的辅助函数。然后我想隐藏某些低级的具体函数,只留下高级函数(将它们视为 API)供用户使用。

例如:

test1.copy() 将在同一个文件中调用另一个辅助函数,它会进行一些额外的检查,但我不想将它暴露给用户。

4

4 回答 4

11

单个前导下划线是 Python 命名约定。许多工具依赖于该约定。例如help()将忽略单个下划线名称。使用from somemodule import *也将忽略单个下划线名称。

双前导下划线触发名称修改(在名称前加上类名和单个前导下划线)。它用于创建线程局部引用。这允许不会被子类意外中断的类内调用。在http://docs.python.org/tutorial/classes.html#private-variables的教程中有一个很好的例子。

最后,有两个前导下划线两个尾随下划线的特殊方法命名约定。解释器使用这些名称来实现运算符并实现许多标准协议(即迭代器、上下文管理器、酸洗等)。请参阅http://www.rafekettler.com/magicmethods.html以获得有关特殊方法的精彩文章。

于 2012-04-23T06:54:52.963 回答
3

领先的下划线约定就是这样 -礼貌的程序员尊重的约定。

前导下划线是对其他程序员的提示,它_function()是内部实现细节,不应在外部使用。没有什么能阻止他们打电话_function()- 但这样做他们会忽略你的暗示,即实施_function()可能随时改变。如果有什么东西坏了,他们可以保留这两部分。

Python 解释器不强制执行任何类型的限制。

于 2012-04-23T06:08:26.870 回答
2

嗯,这是一个相当成熟的命名惯例,这不是什么。此外,它会影响from [module] import *,它只导入不带下划线前缀的函数。

于 2012-04-23T06:07:42.737 回答
2

如果我没记错的话,实际上没有一种干净的方法可以在 python 中将任何函数设为私有。该语言不打算以这种方式工作。下划线符号只是开发人员之间的一种通用协议,用于表示可能是私有的或隐藏的东西。

然而,可能有一种方法可以模拟私有功能。我脑海中浮现的第一件事是使用回溯模块,然后检查调用实例,看看它是否符合预期。这绝不是我在我的项目中会做的事情,我强烈建议不要这样做,但如果你绝对不能没有它,那可能是一种方法。

于 2012-04-23T06:10:28.677 回答