2017-05-08 66 views
-1

我在Python模块哈瓦两个全局变量: load.py:蟒蛇进口全局变量,但调用的函数

a = load_a() 
b = load_b() 

我想在我的测试文件导入: test.py:

from load import a 

然而,我发现,b也叫,load_b()也被称为 和load_b()可能会花费大量的时间 所以我的问题是我怎么能只加载但不叫load_b()功能

+0

你在那个目录中有一个空白的'__init__.py'文件吗? – Exprator

+0

是的,我想只加载一个,但不是B,但是,B也是解释和load_b()函数调用 –

+0

这是所有正常的Python代码,定义正常变量。如果你只想导入'b',你认为'import'会跳过'a = ...'行吗?这不是它的工作原理...... – deceze

回答

0

import总是从上到下执行模块。加载特定变量的名字也不是没有可能完全执行模块:

from load import a 

是等价的:

# test.py 
import load 
a = load.a 

你不能只加载一个模块的一部分,有许多理由这种行为。例如,您load_a功能可以使用之前或之后load_a函数中定义的全局变量:

def load_a(arg): 
    if arg in table: 
     # do something here... 

table = [1,2,3,4] 

load_a也可以改变可能的全局变量。

的函数对象的内置__module__名字与这里居然被定义的功能模块相关联,即使您使用from ... import ...声明:

>>> from load import a_load 
>>> a_load.__module__ 
'load' 

然而,您可以测试标志,以防止调用load_b或者你甚至可以用装饰@,也有这种情况,当然许多变通方法:

if flag_b 
    b = load_b() 
+0

最后的解决方法建议不是你应该做的事,你应该重新考虑你的模块结构。其余的答案是伟大的,但。 – deceze

+0

@deceze我同意,特别是如果你有数百个这样的电话,你最终会抛弃你的代码与这样的标志。尽管它可以用于简单任务,但不是非常优雅。 *不要'把它作为一个建议,只是一个简化的解决方法;-) – direprobs

+0

所以,我如何重构代码以避免它? –

0

你应该重新考虑你的设计。如果导入模块想要做一些初始化,它应该必须这样做。进口模块应该只提供工具:

import load 
a = load.load_a() 

这样,你的模块将有较少的意想不到的副作用,并将更具可测试性。