我正在尝试减少代码中的复制/粘贴,并且偶然发现了这个问题。我已经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])),')'
我可以使用任何替代方法来获得相同的效果吗?
感谢。
答案 0 :(得分:6)
好的,评论已经失控; - )
现在似乎确定类对象不是问题。如果是,那么当首次构建dict时,错误将在第一个行上触发:
chunkFuncs = {Math_EXP : Math_EXPChunk, Assignment : AssignmentChunk, Function : FunctionChunk}
如果您尝试使用不可用密钥构造dict,则dict创建会立即失败:
>>> {[]: 3}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
但是你超越了这一行,Assignment
是你构建的词典的关键。所以错误在这一行:
localScope = chunkFuncs[chunk](chunk,localScope)
最好的猜测是Assignment
的实例不可用:
>>> class mylist(list):
... pass
...
>>> hash(mylist)
2582159
>>> hash(mylist())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'mylist'
请参阅? mylist
是可清除的,但实例mylist()
不是。
后来:最好的猜测是,你无法绕过这个。为什么?由于基类的名称,pyPeg.List
。如果它像Python列表那样是可变的,那么实例将不会是可混合的 - 而且不应该是(可变对象总是像dict键一样危险)。您仍然可以通过id(the_instance)
为dict编制索引,但是如果不知道更多关于代码的信息,那么这是否是我无法猜测的。
答案 1 :(得分:1)
您应该可以,是的,但您可能需要额外type
来电:
>>> class X:
... pass
...
>>> class_map = {X: 5}
>>> my_x = X()
>>> class_map[type(my_x)]
5