如何在Python中避免加载特定模块中的变量

15 浏览
0 Comments

如何在Python中避免加载特定模块中的变量

这个问题已经有了答案:

Python中有类的“私有”变量吗?

(我已经查看了Python中有类的“私有”变量吗? -- 它问的是关于类而不是模块。因此,在那里的答案不涵盖我感兴趣的import。)

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

例如:

# x.py
y=10

然后我们在另一个模块中使用它:

import x 
print x.y

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

admin 更改状态以发布 2023年5月24日
0
0 Comments

在正常使用中,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,但您不应该这样做。

0
0 Comments

如果你通过import module来导入模块,那么就没有任何方法可以隐藏任何全局成员,这是有意为之的:返回的模块对象是"真正的"对象,正是该对象被模块成员使用。__getattr__这样的肮脏的hack对于模块也是禁止的。

一种方法是使用带有前导下划线的"内部"实体来提示用户它们不适用于外部使用。这对于你导入的其他模块的引用来说并不是必需的,因为指南明确禁止外部使用它们(唯一的例外是如果所引用的模块通常无法访问)。

然而,当执行from module import *时,你并没有获得一个模块引用,而是将它们直接导入到当前命名空间中。默认情况下,除了以下划线开头的名称之外的所有名称都会被导入。你可以通过定义__all__模块属性来覆盖这个默认行为。

0