如何避免从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中的模块加载特定变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章