【发布时间】:2009-10-23 07:02:31
【问题描述】:
Python 不允许将不可散列的对象用作其他字典中的键。正如 Andrey Vlasovskikh 所指出的,对于使用非嵌套字典作为键的特殊情况,有一个很好的解决方法:
frozenset(a.items())#Can be put in the dictionary instead
有没有使用任意对象作为字典键的方法?
示例:
这将如何用作密钥?
{"a":1, "b":{"c":10}}
您实际上必须在代码中使用类似的东西是非常罕见的。如果您认为是这种情况,请考虑先更改您的数据模型。
具体用例
用例是缓存对任意关键字函数的调用。字典中的每个键都是一个字符串(参数的名称),对象可能非常复杂,由分层字典、列表、元组等组成。
相关问题
这个子问题已从the problem here 中分离出来。这里的解决方案处理字典没有分层的情况。
【问题讨论】:
-
如果没有人回答这个问题,那么我确实计划自己实现这个(参见 Chris Lutz 的解决方案)并将在此处发布解决方案。但是,请随时回答
-
其实这个问题很讨厌。您几乎可以保证获得类型冲突,即。一种类型的字典与另一种不同:-(
-
仅仅存储类的类型是行不通的,因为包含的类型也可能有类型:-(
-
-1:这不是“非常罕见”。这是不必要的。使用适当的
__hash__函数创建您自己的适当类。 “任意”不应该进入对话。只需定义一个适当的类并消除此问题。 -
我正在添加我的用例:一个在内存中执行的函数
memoize。标准memoize函数的问题是与数据库通信的开销。如果你在内存中使用memoize,当超时不是静态的时,没有简单的方法来清除缓存。
标签: python