2013-10-22 4 views
2

OpenGL을 사용하여 실제로 영리하고 모든 함수와 변수를 사전에 논리적 순서로 저장하고 나중에 기능적 순서로 호출하려고했습니다. 내가사전 키로서의 기능, unhashable 타입

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

내가이 변수 조합 기능이 상관없이받을 파일 얻을이 작업을 수행 할 때

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 

문제이다. 별난 문제는 터미널에서 맞춤 함수를 사용하여 이것을 시도한다는 것입니다.

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

그리고이 방법이 효과적입니다. 그럼 왜 다른 사람이 일하지 않습니까?

+0

"가게 [...] 논리적 인 순서에 사전에"

왜 목록 또는 대신 튜플을 사용하지 마십시오. 사전에는 순서가 없습니다. – NPE

+0

파이썬 사전에는 순서가 없다는 것을 알고 있습니다 *, 맞습니까? –

+0

내 머리 뒤에서 나는 해싱 충돌을 다루는 것이 있다고 생각했으나, 논쟁을 위해 no라고 말하자. dict.keys()는 예상 한 순서대로 키를 계속 내뱉습니다. – EasilyBaffled

답변

2

항목의 순서가 유지되고 중복 키 (예 : glTranslatef)가 있으면 파이썬 사전은 이에 적합한 데이터 구조가 아닙니다.

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") 
]