加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

是否可以在Python 3中使用类作为字典键?

发布时间:2020-12-20 11:30:25 所属栏目:Python 来源:网络整理
导读:我正在尝试减少代码中的复制/粘贴,并且偶然发现了这个问题.我已经google了答案,但所有答案都使用类的实例作为键,我找不到任何关于使用类定义本身作为键(我不知道是否可能). 我的代码是这样的: # All chunkFuncs keys are class definitions,all values are
我正在尝试减少代码中的复制/粘贴,并且偶然发现了这个问题.我已经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,但是在语义上是否正确的是我不能在不了解你的代码的情况下猜测的东西.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读