2017-05-08 69 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() 

這樣,你的模塊將有較少的意想不到的副作用,並將更具可測試性。