2024-04-26 05:30:56 发布
网友
是否有一种内置的方法来获取放置对象的字典键?你知道吗
class Example(): def do_black_magic(self): return __builtin_magic__(self) map = {0: Example()} map[0].do_black_magic() # -> 0 map[1] = map.pop(0) ma[1].do_black_magic() # -> 1
您可以实现一个管理反向映射的字典,但是您必须非常小心地使用反向映射中的键。你知道吗
出于示例的考虑,我非常天真地使用了对象的默认字符串表示形式。你肯定想用别的东西(比如在你的Example类中实现__eq__和__hash__)。你知道吗
Example
__eq__
__hash__
from collections import UserDict class MyDict(UserDict): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._reverse_mapping = {} def __setitem__(self, key, value): super().__setitem__(key, value) self._reverse_mapping[str(value)] = key def get_reversed_mapping(self, value): return self._reverse_mapping[str(value)] class Example: pass my_dict = MyDict() obj_1 = Example() my_dict[1] = obj_1 print(my_dict.get_reversed_mapping(obj_1)) obj_2 = Example() my_dict[2] = obj_2 print(my_dict.get_reversed_mapping(obj_2))
输出
1 2
我强调得太多了:不要使用对象的字符串表示。如果这种表述发生变化,它将惨败:
class Example: def __init__(self, n): self.n = n def __str__(self): return str(self.n) my_dict = MyDict() obj = Example(1) my_dict[1] = obj print(my_dict.get_reversed_mapping(obj)) obj.n = 2 print(my_dict.get_reversed_mapping(obj))
1 Traceback (most recent call last): return self._reverse_mapping[str(value)] KeyError: '2'
您可以实现一个管理反向映射的字典,但是您必须非常小心地使用反向映射中的键。你知道吗
出于示例的考虑,我非常天真地使用了对象的默认字符串表示形式。你肯定想用别的东西(比如在你的
Example
类中实现__eq__
和__hash__
)。你知道吗输出
我强调得太多了:不要使用对象的字符串表示。如果这种表述发生变化,它将惨败:
输出
相关问题 更多 >
编程相关推荐