python中的私有函数

时间:2017-01-18 21:10:20

标签: python function import

是否可以避免导入from file import function的文件? 有人告诉我,我需要将下划线作为前缀,例如:_function,但不起作用。

由于遗留代码,我使用的是Python 2.6。

2 个答案:

答案 0 :(得分:3)

有一些方法可以阻止导入,但它们通常都是黑客攻击,你想要避免它们。通常的方法是使用下划线:

def _function():
    pass

然后,当您导入时,

from my_module import *

您会注意到_function 已导入,因为它以下划线开头。但是,您始终可以这样做:

# In Python culture, this is considered rude
from my_module import _function

但你不应该这样做。只是不要这样做,你会没事的。 Python的态度是我们都是成年人。还有很多其他事情你不应该做的更糟糕,比如

import my_module
# Remove the definition for _function!
del my_module._function

答案 1 :(得分:2)

Python中有无隐私。只有约定管理外部代码应该考虑公开访问和使用的内容。

首次导入模块,触发模块对象的创建以及模块中所有顶级代码的执行。模块对象包含全局命名空间,该代码的结果已运行。

因为Python是动态的,所以你总能反省模块命名空间;您可以看到定义的所有名称,这些名称引用的所有对象,您可以访问和更改所有内容。如果这些名称以下划线开头,则无关紧要。

因此,对名称使用前导_下划线的唯一原因是文档该名称是模块实现的内部,并且外部代码不应该依赖在该名称中存在于未来版本中。 from module import *语法将仅因此原因忽略此类名称。但无论如何,你无法阻止一个坚定的程序员访问这样的名字。他们只是冒着自己的风险这样做,你不应该让他们远离这种访问。

如果您只有初始化模块所需的功能或其他对象,您当然可以在最后删除这些名称。