你觉得这个主意怎么样?它应该是一个可以合理猜测您试图为getter和删除器访问的键的数据。策划人应该不动。
类似于bash中的选项卡完成,如果您输入的某些命令只有一个合理的完成,那么按下选项卡将为您填写。
逻辑应该是这样的,如果query_key不在dict中,但是只有一个dict_key满足表达式query_key in dict_key,那么我们可以假设这是关键。此外,对于字符串键,它应该不区分大小写.
class FriendlyDict(dict):
def _guess_key_or_die(self, q):
possibilities = []
for key in self:
try:
if q in key or q.lower() in key.lower():
possibilities.append(key)
except (TypeError, AttributeError):
pass
if len(possibilities) == 1:
return possibilities[0]
err = KeyError(q)
err.data = possibilities
raise err
def __getitem__(self, key):
try:
return super(FriendlyDict, self).__getitem__(key)
except KeyError:
guess = self._guess_key_or_die(key)
return super(FriendlyDict, self).__getitem__(guess)
def __delitem__(self, key):
try:
return super(FriendlyDict, self).__delitem__(key)
except KeyError:
guess = self._guess_key_or_die(key)
return super(FriendlyDict, self).__delitem__(guess)
def __contains__(self, key):
if super(FriendlyDict, self).__contains__(key):
return True
try:
self._guess_key_or_die(key)
except KeyError:
return False
else:
return True__dunder__方法?OrderedDict )一起使用?发布于 2014-09-19 13:04:40
我建议实施以下几种其他方法:
get;setdefault;has_key (如果支持2.x);以及__repr__/__str__.在可哈斯集合(tuple,frozenset)上有一个边缘案例:
>>> d = FriendlyDict()
>>> d[(1, 2)] = "foo"
>>> d[1]
'foo'
>>> d[frozenset(("bar", "baz"))] = 3
>>> d["bar"]
3同样,等式比较可能是一个问题--如果所有(大多数)都是相同的,那么两个FriendlyDicts应该被认为是平等的吗?他们的钥匙“足够近”并且有相同的值?
在附加特性方面,考虑数字键是否应该与某些容忍字典匹配--没有很好地处理浮点数的字典可能是使用这个类的原因之一。此外,字符串键中缺少的字母可能是要接收的东西(例如,d["parameer"])。
https://codereview.stackexchange.com/questions/63344
复制相似问题