ebw <moyon_d...@yahoo.fr> added the comment:
I actually have a real life use case of that problem. Using the eval() function of pandas need to use a custom resolver: class Resolver(object): def __getitem__(self, name): if name == "test": return 0.5 else: raise KeyError resolvers = (Resolver(), ) pd.eval("test", resolvers=resolvers) But pandas store the resolvers used for eval() in a DeepChainMap and uses bool(len(self.resolvers)) in the property has_resolvers. Which with my custom Resolver raise a KeyError because __getiem__ gets call with name = 0. The way to solve/bypass the problem was to make Resolver a inherit from UserDict. class Resolver(UserDict): def __init__(self, data={}): super(Resolver, self).__init__(data) self.data["test"] = None def __getitem__(self, name): if (name == "test"): return 0.5 else: super(Resolver, self).__getitem__(name) resolvers = (Resolver(), ) pd.eval("test", resolvers=resolvers) I had to add a dummy "test" value to Resolver.data dict to avoid len(self.resolvers) to be 0. I tried to implement Resolver.__len__, keys... but it didn't help has ChainMap compute the len using set().union(*self.maps). ---------- nosy: +ebw _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue30689> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com