Function 定义非类私有函数在Python中有什么意义吗?

Function 定义非类私有函数在Python中有什么意义吗?,function,python,Function,Python,我尝试了导入,并且可以访问: def __f(): print 1 def _f(): print 1 这有什么意义吗?我想写一些非基于类的助手函数。然后我想隐藏某些低级的、具体的函数,只留下高级函数(将它们视为API)供用户使用 例如: test1.copy()将调用同一文件中的另一个helper函数,该函数将执行一些额外的检查,但我不想将其公开给用户。好吧,这是一个相当成熟的命名约定,这不是什么。此外,它还影响[module]import*中的,后者只导入不带下划线前缀的函数。主

我尝试了导入,并且可以访问:

def __f():
  print 1

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

例如:


test1.copy()将调用同一文件中的另一个helper函数,该函数将执行一些额外的检查,但我不想将其公开给用户。

好吧,这是一个相当成熟的命名约定,这不是什么。此外,它还影响[module]import*中的
,后者只导入不带下划线前缀的函数。

主要的下划线约定就是礼貌的程序员所尊重的约定

前导下划线提示其他程序员,
\u function()
是一个内部实现细节,不应在外部使用。没有什么可以阻止他们调用
\u function()
——但是这样做会忽略您关于
\u function()
的实现可能随时改变的提示。如果有东西坏了,他们就要保留两块


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

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


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

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

双前导下划线触发名称混乱(使用类名和单前导下划线作为名称前缀)。它用于创建线程本地引用。这允许类内调用不会被子类意外破坏。在上的教程中有一个很好的例子


最后,还有两个前导下划线和两个尾随下划线的特殊方法命名约定。解释器使用这些名称来实现运算符和实现许多标准协议(即迭代器、上下文管理器、pickling等)。有关特殊方法的详细说明,请参阅。

我相信它可能会影响
帮助(模块)
。谢谢。我已经忘记了这个技巧,尽管这是一个技巧,因为用户仍然可以执行
导入test1
。谢谢。请注意,[module]import*
中的
是一种可怕的做法-它会污染您的命名空间,并会产生令人兴奋的名称冲突。不要在生产代码中这样做。是的。我知道,李昂:)谢谢。我总是忘记这一点。然而,两个主要的下划线不仅仅是一个惯例。它们在类定义中使用时具有特殊意义。非常感谢。读我的入门书花了很长时间。不错的评论,我想:)你可以做一些可怕的事情,比如猴子修补
\uuuu调用方法(
),等等。让我们不要谈论那个。。。shuddersIt也可以使用手动滚动模块(子类模块和覆盖
\uuuu getattribute\uuuuu
来检查访问权限…但是,是的,不要这样做:)谢谢。我欣然接受了李昂业的请求:)谢谢,雷蒙德。
>>> import test1
>>> test1._f()
1