2013-03-05 53 views
0
#constants.py 

TAU = 5.55555 

ref_X = 95.047 
ref_Y = 100.000 
ref_Z = 108.883 

def main(): 
    DTEP = {} 
    DTEP['1'] = 1.22222 

現在,如果我進口TAU這樣的:導入錯誤,而進口的一些常量

from constants import TAU 

沒有錯誤,但如果我進口依照同樣的方法DTEP它顯示了這個錯誤:

ImportError: cannot import name DTEP 

現在爲什麼這個錯誤?要麼它應該能夠導入所有的常量或者沒有。爲什麼這種偏見與DTEP?

添加完整的代碼(名稱是DTEP1在這裏,我知道):

TAU = 5.55555 

import shelve 

ref_X = 95.047 
ref_Y = 100.000 
ref_Z = 108.883 
DTEP1 = {} 

def main(): 
    d = shelve.open("tables/DTEP_132758.txt") 
    for k in xrange(0,132758): 
     DTEP1[str(k)] = rgb_to_cielab(d[str(k)][0], d[str(k)][1], d[str(k)][2]) 
    print DTEP1['1223'] 



def rgb_to_xyz(R, G, B): 
    ''' 
    Convert from RGB to XYZ. 
    ''' 
    var_R = (R/255.) 
    var_G = (G/255.) 
    var_B = (B/255.) 

    if var_R > 0.04045: 
     var_R = ((var_R + 0.055)/1.055) ** 2.4 
    else: 
     var_R /= 12.92 

    if var_G > 0.04045: 
     var_G = ((var_G + 0.055)/1.055) ** 2.4 
    else: 
     var_G /= 12.92 
    if var_B > 0.04045: 
     var_B = ((var_B + 0.055)/1.055) ** 2.4 
    else: 
     var_B /= 12.92 

    var_R *= 100 
    var_G *= 100 
    var_B *= 100 

    #Observer. = 2 deg, Illuminant = D65 
    X = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805 
    Y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722 
    Z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505 

    return X,Y,Z 


#-------------------------------------------------# 
def xyz_to_cielab(X, Y, Z): 
    ''' 
    Convert from XYZ to CIE-L*a*b* 
    ''' 
    var_X = X/ref_X 
    var_Y = Y/ref_Y 
    var_Z = Z/ref_Z 

    if var_X > 0.008856: 
     var_X **= (1./3.) 
    else: 
     var_X = (7.787 * var_X) + (16./116.) 
    if var_Y > 0.008856: 
     var_Y **= (1./3.) 
    else: 
     var_Y = (7.787 * var_Y) + (16./116.) 
    if var_Z > 0.008856: 
     var_Z **= (1./3.) 
    else: 
     var_Z = (7.787 * var_Z) + (16./116.) 

    CIE_L = (116 * var_Y) - 16. 
    CIE_a = 500. * (var_X - var_Y) 
    CIE_b = 200. * (var_Y - var_Z) 

    return CIE_L, CIE_a, CIE_b 


#-------------------------------------------------# 
def rgb_to_cielab(R, G, B): 
    ''' 
    Convert from RGB to CIE-L*a*b*. 
    ''' 
    X,Y,Z = rgb_to_xyz(R,G,B) 
    return xyz_to_cielab(X,Y,Z) 

if __name__ == "__main__": 
    main() 
+1

'DTEP'在一個函數的定義,而不是在全球範圍內。 – Volatility 2013-03-05 06:21:16

+2

爲什麼你有一個名爲'constants.py'的模塊定義了一個方法?如果你不打算執行它們,它們什麼都不做。 (在Python中,名爲'main'的函數沒有什麼特別之處,它們在導入模塊時不會自動執行。) – 2013-03-05 06:25:10

回答

4

DTEP是在main功能的範圍。只能導入在模塊級別定義的變量(如TAUref_X)。

在這種情況下,這個問題可以簡單地通過了main功能的移動DTEP的原始定義(但不一定是填充它的行)解決:或者

DTEP = {} 

def main(): 
    DTEP['1'] = 1.22222 

main() 

,您可以使用global關鍵字在main功能(不過請注意,只有當你在某個時刻從模塊級調用main()作品):

def main(): 
    global DTEP 
    DTEP = {} 
    DTEP['1'] = 1.22222 

main() 

也許日Ë最好的解決辦法就是擁有一切在同一水平,擺脫main功能:

TAU = 5.55555 

ref_X = 95.047 
ref_Y = 100.000 
ref_Z = 108.883 

DTEP = {} 
DTEP['1'] = 1.22222 
+0

好吧,但是如何獲得DTEP的值呢? – 2013-03-05 06:23:16

+0

@ user1786791將它移出主界面?像TAU之後? – 2013-03-05 06:23:46

+0

好的,讓我試着全局定義它 – 2013-03-05 06:23:51