我正在尝试减少代码中的复制/粘贴操作,但偶然发现了这个问题。我用谷歌搜索了答案,但所有答案都使用类的实例作为键,我找不到任何关于使用类定义本身作为键的信息(我不知道这是否可能)。
我的代码是这样的:
# 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])),')'
我可以使用任何其他方法来获得相同的效果吗?
谢谢。
最佳答案
好吧,评论失控了;-)
现在似乎可以肯定类对象不是问题所在。如果是,错误将在 first 行触发,当字典首次构建时:
chunkFuncs = {Math_EXP : Math_EXPChunk, Assignment : AssignmentChunk, Function : FunctionChunk}
如果您尝试使用不可散列的键构造字典,字典创建会立即失败:
>>> {[]: 3}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
但是你超出了那条线,Assignment
是你构造的字典中的一个键。所以错误就在这一行:
localScope = chunkFuncs[chunk](chunk,localScope)
最好的猜测是它是 Assignment
的一个 instance,它是不可散列的:
>>> 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)
为字典编制索引,但如果不进一步了解您的代码,我无法猜测这是否在语义上是正确的。
关于python - 是否可以在 Python 3 中将类用作字典键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19239010/