【发布时间】:2013-10-22 15:47:45
【问题描述】:
我试图让 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
这奏效了。那么为什么另一个不起作用呢?
【问题讨论】:
-
“按逻辑顺序将 [...] 存储在字典中”。字典是无序的。
-
你知道 Python 字典没有顺序,对吧?
-
在我的脑海中,我猜想它可以处理散列冲突,但为了争论,我们说不。 dict.keys() 仍然按预期的顺序吐出键不是吗?
-
@EasilyBaffled:不,
dict.keys()会按照自己喜欢的顺序吐出密钥。collections.OrderedDict可能值得一看。 -
当然你不能有重复的键(
glTranslatef在你的例子中)。
标签: opengl python-2.7 dictionary function-pointers