Message330606
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). |
|
Date |
User |
Action |
Args |
2018-11-28 16:00:26 | ebw | set | recipients:
+ ebw, rhettinger, r.david.murray, serhiy.storchaka |
2018-11-28 16:00:26 | ebw | set | messageid: <1543420826.12.0.788709270274.issue30689@psf.upfronthosting.co.za> |
2018-11-28 16:00:26 | ebw | link | issue30689 messages |
2018-11-28 16:00:26 | ebw | create | |
|