5

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

我的代码是这样的:

# 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])),')'

我可以使用其他方法来获得相同的效果吗?

谢谢。

4

2 回答 2

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是你构建的 dict 中的一个关键。所以错误在这一行:

        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 键总是危险的)。您仍然可以按 dict 索引 dict id(the_instance),但是如果不了解更多关于您的代码,我无法猜测这在语义上是否正确。

于 2013-10-08T04:47:10.010 回答
2

你应该可以,是的,但你可能需要一个额外的type电话:

>>> class X:
...     pass
...
>>> class_map = {X: 5}
>>> my_x = X()
>>> class_map[type(my_x)]
5
于 2013-10-08T04:21:39.037 回答