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

Reply via email to