ebw <[email protected]> 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 <[email protected]>
<https://bugs.python.org/issue30689>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com