func_code vs. string problem

Filip Dreger fdreger at amiga.pl
Sat Apr 23 17:47:22 EDT 2005


Uzytkownik "Steven Bethard" <steven.bethard at gmail.com> napisal w 
wiadomosci news:04mdnXLeedaPLvffRVn-vQ at comcast.com...

> See the documentation:
>
> http://docs.python.org/ref/dynamic-features.html
>
> """The eval(), execfile(), and input() functions and the exec 
> statement do not have access to the full environment for resolving 
> names. Names may be resolved in the local and global namespaces of 
> the caller. Free variables are not resolved in the nearest enclosing 
> namespace, but in the global namespace."""

Thank you! I feel silly I have not found the piece of instruction 
myself. And even worse, as I still do not understand: if exec() 
resolves free bariable names in the global namespace, how come it 
works well with code in a string? Or with a code in a compiled string?

> Note the last sentence, which tells you that your free variable, 
> 'abc', will be resolved in the *global* namespace.  In your 
> particular problem, you can solve this by substituting your local 
> namespace for the global namespace.

This particular problem - sadly - is a simplified version of the real 
one. I need access to both: global and local namespaces, so this 
solution is not for me.
The manual says I can pass two dictionaries to exec, one for global 
namespace and one for local. But, strange as it seems, I could not get 
it to work. In the example I gave, changing exec f.func_code to exec 
f.func_code in globals(),locals() does not help a bit.

> One possible workaround might be:
>
> py> class foo:
> ...     def test(self):
> ...         print "ABC"
> ...     def checkfunction(self):
> ...         abc=10
> ...         l = locals()
> ...         l.update(globals())
> ...         exec myfunction.func_code in l
> ...     def checkstring(self):
> ...         abc=10
> ...         exec "print abc;self.test()"
> ...
> py> foo().checkfunction()
> __main__.foo
> 10
> ABC

I thought about that... I don't know why, but it seems wrong. Maybe 
the updating dictionaries is not very expensive, but there must be 
some better way. This code has a 'workaround - fixme' written all over 
it.
Up to now, each time I encountered such a workaroundish solution, it 
turned out Python has a cleaner way to do it. I sure hope this is also 
the case here :-).

> But I'd have to know what your real use case is to tell you whether 
> or not this is worth the trouble.  Why do you want to exec the 
> func_code anyway?  Why can't you just call the function?

I put the description in the other post. Perhaps it's jkust my design 
that's broken.
Thanks again.

regards,
Filip Dreger





More information about the Python-list mailing list