python - 是否可以在 Python 3 中将类用作字典键?

标签 python hash dictionary python-3.x

我正在尝试减少代码中的复制/粘贴操作,但偶然发现了这个问题。我用谷歌搜索了答案,但所有答案都使用类的实例作为键,我找不到任何关于使用类定义本身作为键的信息(我不知道这是否可能)。

我的代码是这样的:

# 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/

相关文章:

python - 字典中的 NumPy 切片表示法

python - Pandas 组中的唯一值

ruby - 使用 HashMap 测试顺序

c# - PBKDF2 c#.NET 的性能

c++ - 散列图像(一系列 rgb 字节)

javascript - 如何可靠地检查对象是 EcmaScript 6 Map/Set?

python - 如何*懒惰地*迭代 OrderedDict 中键的反向顺序?

Python 符号?

python - 来自具有不同键名的字典的数据类

python - 为什么 sum() 没有关键参数?