【问题标题】:Function as dictionary keys, unhashable type用作字典键,不可散列类型
【发布时间】: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


【解决方案1】:

鉴于您希望项目保持其顺序,并且您有重复的键(在您的示例中为 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")
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 2016-01-11
    • 2019-08-29
    • 2012-01-21
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多