如何获取地图钥匙位于哪个对象中?

时间:2019-09-13 10:39:05

标签: python dictionary

是否有内置的方法来获取放置对象的字典键?

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

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'