如何在Python中避免加载特定模块中的变量
如何在Python中避免加载特定模块中的变量
这个问题已经有了答案:
(我已经查看了Python中有类的“私有”变量吗? -- 它问的是关于类而不是模块。因此,在那里的答案不涵盖我感兴趣的import
。)
考虑一下,如果有一个名为X
的模块,其中有一个变量y
。如果任何其他模块尝试import
模块X
,如何在Python中避免加载变量y
?
例如:
# x.py y=10
然后我们在另一个模块中使用它:
import x print x.y
如何避免从模块x.py访问x.y?
在正常使用中,import foo
只会导入一次模块,所有其他的导入都会发现它已经被导入过了,不会再次加载它。
引用自https://docs.python.org/3/reference/import.html#the-module-cache:
在导入模块时,模块名会在sys.modules中查找,如果存在,关联的值就是满足导入的模块,进程就会完成。但是,如果值为None,则会引发ImportError。如果模块名不存在,则Python将继续搜索该模块。
这是解释器的一个长期特性,回溯至至少2.7版本,可能更早。
回答您的具体问题,没有变量y
,有的是x.y
,因为这是您导入的东西。如果您做了不被推荐的from module import *
,您可能会得到y
,但您不应该这样做。
如果你通过import module
来导入模块,那么就没有任何方法可以隐藏任何全局成员,这是有意为之的:返回的模块对象是"真正的"对象,正是该对象被模块成员使用。像__getattr__
这样的肮脏的hack对于模块也是禁止的。
一种方法是使用带有前导下划线的"内部"实体来提示用户它们不适用于外部使用。这对于你导入的其他模块的引用来说并不是必需的,因为指南明确禁止外部使用它们(唯一的例外是如果所引用的模块通常无法访问)。
然而,当执行from module import *
时,你并没有获得一个模块引用,而是将它们直接导入到当前命名空间中。默认情况下,除了以下划线开头的名称之外的所有名称都会被导入。你可以通过定义__all__
模块属性来覆盖这个默认行为。