Using non-dict namespaces in functions
Peter Otten
__peter__ at web.de
Sun Mar 18 03:50:46 EDT 2012
Steven D'Aprano wrote:
> On Sat, 17 Mar 2012 11:42:49 -0700, Eric Snow wrote:
>
>> On Sat, Mar 17, 2012 at 4:18 AM, Steven D'Aprano
>> <steve+comp.lang.python at pearwood.info> wrote:
>>> Note that it is important for my purposes that MockChainMap does not
>>> inherit from dict.
>>
>> Care to elaborate?
>
> I want to use collections.ChainMap, or something very like it, and I
> don't want to be forced into an unnatural is-a relationship with dict if
> I don't have to.
>
>
> [...]
>> Regardless, you could also implement __call__() on a function look-alike
>> class to get what you're after. It may not be as performant though.
>
> I don't think that can work, because __call__ itself is a function, and I
> would need to change *its* globals. Which brings me back exactly where I
> started, trying to change globals in a function to a non-dict.
The key lookup code in ceval.c is inlined, so even subclassing dict and
overriding __getitem__() won't help. Instead of
def f(a):
return a + b # b taken from some custom namespace
you have to resort to the conventional approach
def f(a, ns=magic()):
return a + ns["b"]
or
def f(self, a):
return a + self.b
More information about the Python-list
mailing list