我正在尝试减少代码中的复制/粘贴,并且偶然发现了这个问题.我已经google了答案,但所有答案都使用类的实例作为键,我找不到任何关于使用类定义本身作为键(我不知道是否可能).
我的代码是这样的:
# All chunkFuncs keys are class deFinitions,all values are functions chunkFuncs = {Math_EXP : Math_Expchunk,Assignment : AssignmentChunk,Function : FunctionChunk} def Chunker(chunk,localScope): for chunkType in chunkFuncs: if isinstance(chunk,chunkType): # The next line is where the error is raised localScope = chunkFuncs[chunk](chunk,localScope) return localScope
而错误就是这个
TypeError: unhashable type: 'Assignment'
以下是类定义:
class Math_EXP(pyPeg.List): grammar = [Number,Symbol],pyPeg.maybe_some(Math_OP,[Number,Symbol]) class Assignment(pyPeg.List): grammar = Symbol,'=',[Math_EXP,Number] class Function(pyPeg.List): grammar = Symbol,'(',pyPeg.optional(pyPeg.csl([Symbol,Number])),')'
谢谢.
解决方法
好的,评论已经失控;-)
现在似乎确定类对象不是问题.如果是,则在第一行构建dict时,错误将在第一行触发:
chunkFuncs = {Math_EXP : Math_Expchunk,Function : FunctionChunk}
如果您尝试使用不可用密钥构造dict,则dict创建会立即失败:
>>> {[]: 3} Traceback (most recent call last): File "<stdin>",line 1,in <module> TypeError: unhashable type: 'list'
但是你超越了这一行,而作业是你构建的词典的关键.所以错误在这一行:
localScope = chunkFuncs[chunk](chunk,localScope)
最好的猜测是它是一个不可用的赋值实例:
>>> class mylist(list): ... pass ... >>> hash(mylist) 2582159 >>> hash(mylist()) Traceback (most recent call last): File "<stdin>",in <module> TypeError: unhashable type: 'mylist'
看到? mylist是可清除的,但实例mylist()不是.
后来:最好的猜测是,你无法绕过这个.为什么?由于基类的名称,pyPeg.List.如果它像python列表那样是可变的,那么实例将不会是可混合的 – 而且不应该是(可变对象总是像dict键一样危险).你仍然可以通过id(the_instance)来索引一个dict,但是在语义上是否正确的是我不能在不了解你的代码的情况下猜测的东西.