我正在尝试定义一个类似命名空间的对象,它可以有重要参数。这很有用,这样我就可以为对象实现哈希函数,该函数只会哈希标记为重要的成员。我希望API尽可能接近命名空间样式,但据我所知,没有简单的方法可以做类似的事情
n = MyNamespace()
n.a = (1, True)
将1
存储在__dict__
中,而True
将存储在其他字典中,以保持1
重要的知识。
我可以想到一种使用setter这样做的方法,但是这有点笨重而且非pythonic并且需要一种丑陋的配对元组直接实例化。
class SignificantNamespace(object):
def __init__(self, *args):
self.significant = {}
for name, val, significance in args:
setattr(self, name, val)
self.significant[name] = significance
def set(self, name, val, significant=True):
setattr(self, name, val)
self.significant[name] = significant
你们觉得怎么样?是否有更好/更清洁的方法来做到这一点?
答案 0 :(得分:1)
如果我理解你,你可以这样做:
class MyNamespace(object):
def __hash__(self):
"""Only hash dict key pairs that are significant"""
d_keys = sorted(self.__dict__.keys())
to_hash = []
for k in d_keys:
v = self.__dict__[k]
if v[1]:
to_hash.append((k, v[0]))
return hash(frozenset(to_hash))
def get_signifcant_dict(self):
return {k: v[0] for k, v in self.__dict__.items() if v[1]}
用法示例:
>>> my = MyNamespace()
>>> my.a = (1, True)
>>> my.__hash__()
-2550060783245333914
>>> my.b = (2, False)
>>> my.__hash__()
-2550060783245333914 # hash didn't change since `b` is not signifcant
>>> my.get_signifcant_dict()
{'a': 1}