如何避免从python中的模块加载特定变量[重复]

Posted

技术标签:

【中文标题】如何避免从python中的模块加载特定变量[重复]【英文标题】:How can avoid loading particular variable from module in python [duplicate] 【发布时间】:2016-03-26 18:50:33 【问题描述】:

(我查看了Does Python have “private” variables in classes?——它询问的是类而不是模块。因此,那里的答案不包括我感兴趣的import。)

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

例如:

# x.py
y=10

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

import x 
print x.y

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

【问题讨论】:

加载变量y有副作用吗?你知道__all__ 变量吗? @memoselky,是的,我想隐藏在模块中导入的特定变量,但我不知道 __all__ 一些示例代码会极大地改善这个问题。目前尚不清楚确切的需求是什么。 该问题的版主将其标记为“Python 是否在类中有‘私有’变量?”显然不知道Python。这个问题不是那个问题的重复。版主显然对 Python 非常无知,以至于他们不知道“类”和“模块”之间的区别。如果你问我,这种情况是相当可悲的。顺便说一句,ivan_pozdeev 在下面提供了正确的答案。 【参考方案1】:

正常使用import foo只导入一次模块;所有其他导入看到它已经被导入,并且不会再次加载它。

Qhttps://docs.python.org/3/reference/import.html#the-module-cache:

在导入期间,模块名称在 sys.modules 中查找,如果 现在,关联的值是满足导入的模块,并且 该过程完成。但是,如果值为 None,则 引发了 ImportError。如果缺少模块名称,Python 将 继续搜索模块。

这一直是解释器的一个功能,可以追溯到 at least to version 2.7 并且可能更早。


说到你的具体问题,没有变量y,有x.y,因为那是你导入的。如果您执行极不推荐的from module import *,您最终可能会得到y,但您不应该这样做。

【讨论】:

【参考方案2】:

如果您使用import module,则无法隐藏任何全局成员,这是故意的:the module object returned is the "true" one,与模块成员使用的完全相同。 Dirty hacks like __getattr__ are also prohibited for modules.

一种方法是使用前导下划线标记“内部”实体,以向用户提示它们不适合外部使用。这对于您导入的其他模块的引用不是必需的,因为指南明确不鼓励外部使用它们(唯一的例外是如果引用的模块无法以正常方式访问)。

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

【讨论】:

以上是关于如何避免从python中的模块加载特定变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何避免为页面加载和 DOM 更改重复此特定代码?

从内存中导入 Python 模块 [重复]

如何从两个文件夹中读取文件并避免在 Python 中重复

如何避免将大文件重复加载到 python 脚本中?

使用C语言为python编写动态模块--从底层深度解析python中的对象以及变量

在 JavaScript [重复] 中引用未定义变量时如何避免错误