2013-10-22 67 views
2

我試圖用openGL來真正聰明,並將所有函數及其變量以邏輯順序存儲在字典中,然後再按函數順序調用它們。函數作爲字典鍵,難以置信的類型

def complex_draw_square(width, height, x=0, y=0, z=0, x_angle=0, y_angle=0, z_angle=0,): 
    action_dict = { 
     glPopMatrix: "E", 
     glRectf: (0, 0, width, height), 
     glTranslatef: (0, -height, 0), 
     glRotatef: (x_angle, y_angle, z_angle, 1), 
     glTranslatef: (x, y + height, z), 
     glPushMatrix: "E" 
    } 
    return action_dict 

的問題是,當我試圖做到這一點我獲取文件

"/Users/lego90511/PycharmProjects/OpenGLDummy/opengl_shortcuts.py", line 9, in complex_draw_square 
    glPopMatrix: "E", 
TypeError: unhashable type 

我得到這個無論哪個函數的變量組合,我有。奇怪的是,我在終端上使用自定義功能來嘗試此功能。

def sum(x,y): 
    return x + y 
d = {sum: (1, 2)} 
for f in d.keys(): 
    print f(*d[f]) 
>>>3 

而且這個工作。那麼爲什麼其他人不工作?

+0

「店[...]在邏輯順序字典」。字典是無序的。 – NPE

+0

你知道Python字典*沒有訂單*,對嗎? –

+0

在我的腦海中,我猜測它有處理哈希衝突的一些事情,但爲了爭論,讓我們說不。 dict.keys()仍然按照預期的順序吐出鑰匙,他們不會? – EasilyBaffled

回答

2

鑑於您期望的項目保留其順序,並且您有重複的鍵(在您的示例中爲glTranslatef),Python字典不是適合此的數據結構。

爲什麼不使用列表或元組,而不是:

actions = [ 
    (glPopMatrix, "E"), 
    (glRectf, 0, 0, width, height), 
    (glTranslatef, 0, -height, 0), 
    (glRotatef, x_angle, y_angle, z_angle, 1), 
    (glTranslatef, x, y + height, z), 
    (glPushMatrix, "E") 
]