您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何记住**?

如何记住**?

key = (args, frozenset(kwargs.items())

这是您无需假设数据即可做到的“最佳”结果。

但是,似乎可以对词典执行记忆(虽然有点不寻常),但是如果需要,可以特例。例如,您可以frozenset(---.items())在复制字典时递归地应用。

如果这样做sorted,则可能会遇到键无法排序的情况。例如,“子集和相等性比较不能推广到完整的排序函数。例如,任何两个不相交的集合都不相等,也不是彼此的子集,因此以下所有内容均返回False:ab。因此,集合可以无法实现 ()方法

>>> sorted([frozenset({1,2}), frozenset({1,3})])
[frozenset({1, 2}), frozenset({1, 3})]

>>> sorted([frozenset({1,3}), frozenset({1,2})]) # THE SAME
[frozenset({1, 3}), frozenset({1, 2})] # DIFFERENT SORT RESULT

# sorted(stuff) != sorted(reversed(stuff)), if not strictly totally ordered

伊格纳西奥说:“虽然您不能对任意字典使用sorted(),但kwargs将具有str键。” 这是完全正确的。因此,这对于键来说不是问题,但是如果您(或不太可能代表)依赖某种方式进行排序,则可能需要记住一些值。

关于使用str

它是这样 数据将很好地工作,但它是可能的对手(例如,在安全漏洞上下文)制作一个碰撞。您介意这不是一件容易的事,因为大多数认值都repr使用许多良好的分组和转义。实际上,我找不到这种碰撞。但是,草率的第三方或不完整的repr实现都是可能的。

还请考虑以下事项:如果您存储像((<map object at 0x1377d50>,), frozenset(...))和这样的键((<list_iterator object at 0x1377dd0>,<list_iterator object at 0x1377dd0>), frozenset(...)),则只需调用相同的项,缓存就会无限增长。(您也许可以使用正则表达式解决此问题…)并且尝试使用生成器会弄乱您正在使用的函数的语义。尽管如果您想记住is-style平等而不是==-style平等,则这可能是理想的行为。

同样str({1:object()})在解释器中执行类似的操作,每次都会在内存中相同位置返回一个对象!我认为这是工作中的垃圾收集器。这将是灾难性的,因为如果您碰巧正在进行哈希处理,<some object at 0x???????>并且稍后(由于进行垃圾回收)碰巧在相同的内存位置创建了相同类型的对象,则从备注化函数中将得到不正确的结果。如前所述,一种可能真正棘手的解决方法是使用正则表达式检测此类对象。

其他 2022/1/1 18:33:07 有446人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶