class FrozenDict(dict):
def __init__(self,default=None):
if default: self.update(default)
def __hash__(self):
return id(self)
dictionary={FrozenDict({"dsa":"saas"}):"Hi"}
eval(str(dictionary))
TypeError: unhashable type: 'dict'
我正在尝试将字符串转换为它的“原始”形式,因此没有收到错误。字典的“原始”形式是{FrozenDict({"dsa":"saas"}):"Hi"}
像这样:
^{pr2}$太棒了。。在
编辑:
OrderedDict似乎有用,有人知道为什么吗?在
编辑:
这是我试图加载使用酸洗负荷在
^{3}$
要创建“rawform”,您需要重写
__repr__
:我得到的结果是:
^{pr2}$为了这个目的,你有什么理由不能改成{}?在
当然,它没有使用
eval
,但是如果可以避免使用eval
,那么就应该这样做。在你所做的有几个问题。在
首先,您的}生成的是一个常规字典而不是一个新的
eval
不起作用的原因是您没有重写您的FrozenDict
类中的__repr__
方法,因此{FrozenDict
,并且在尝试将其用作字典键时出现错误。这相对容易解决:{{cd7}你可以用它来重新创建你的cd6}代码。在
但是,还有一些其他问题不能解决。例如,当前可以使用哈希不同的字典,即使它们比较为相等:
^{pr2}$这使得在哈希表中无法匹配冻结字典,如果插入时使用的对象不完全相同。在
更好的方法可能是根据字典中的键和值计算哈希。这样做会更好:
但是,现在您将遇到另一个问题:您的字典是可变的,如果您添加或删除其中的值,它的哈希可能会更改。这很糟糕:
要解决这个问题,您可能需要重写},以便在调用它们时引发异常。我想,如果您知道在将值添加到字典后不会修改这些值,可以跳过这一步,但是如果您希望您的类更普遍地有用,则有必要这样做。可能还有一些其他的突变方法我也忘了。在
__setitem__
、__delitem__
和{相关问题 更多 >
编程相关推荐