如何避免在python中从模块加载特定变量

How can avoid loading particular variable from module in python

本问题已经有最佳答案,请猛点这里访问。

(我已经签出python在类中是否有"private"变量?--它询问的是类而不是模块。因此,答案不包括import,这是我感兴趣的内容。)

考虑一下,有一个名为X的模块,其变量为y。如果有其他模块尝试import模块X时,如何避免在python中加载变量y

例如:

1
2
# x.py
y=10

然后我们在其他模块中使用它:

1
2
import x
print x.y

如何避免从模块x.py访问x.y?


如果执行import module,则无法隐藏任何全局成员,这是有意的:返回的模块对象是"真"的,与模块成员使用的对象完全相同。模块也禁止使用像__getattr__这样的恶意黑客。

一种方法是用前导下划线标记"内部"实体,以提示用户它们不是用于外部的。对于您导入的其他模块的引用来说,这是不必要的,因为指导原则明确禁止外部使用它们(唯一的例外是,如果引用的模块以正常方式无法访问)。

但是,在执行from module import *时,您不会得到模块引用,而是直接将其导入当前名称空间。默认情况下,除从下划线开始的名称外,其他所有内容都将导入。您可以通过定义__all__模块属性来覆盖这一点。


在正常使用中,import foo只导入一次模块;所有其他导入都会看到模块已导入,不会再次加载。

Quoth https://docs.python.org/3/reference/import.html模块缓存:

During import, the module name is looked up in sys.modules and if
present, the associated value is the module satisfying the import, and
the process completes. However, if the value is None, then an
ImportError is raised. If the module name is missing, Python will
continue searching for the module.

这一直是解释器的一个特性,至少可以追溯到2.7版,可能更早。

对于您的具体问题,没有变量y,有x.y,因为这是您导入的。如果你做了非常不被认可的from module import *,你可以以y结束,但你不应该这样做。