是否有内置的方法来获取放置对象的字典键?
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
答案 0 :(得分:1)
您可以实现管理反向映射的字典,但是您必须非常非常小心使用反向映射中的键。
为了示例,我非常天真使用了对象的默认字符串表示形式。您肯定会想使用其他东西(即在__eq__
类中实现__hash__
和Example
)。
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'