Accessing Python parse trees

Steve Holden steve at holdenweb.com
Sat Mar 5 19:23:46 CET 2005


Manlio Perillo wrote:
> On 3 Mar 2005 11:15:28 -0800, "Lonnie Princehouse"
> <finite.automaton at gmail.com> wrote:
> 
> 
>>No.  I don't think it's possible to read the parse tree used by the
>>interpreter, especially as it is being created. Here are a couple of
>>kludgy ideas that might come close, though:
> 
> 
> Is this a 'limitation' of the current version or it is impossible for
> the architecture of CPython?
> What about pypy?
> 
> 
>>On a side note, check out the compiler module.  You might find it to be
>>friendlier and more useful than parser.
> 
> 
> Thanks for the hint. It is what I want.
> Unfortunately is seem to be not well documented.
> 
> 
> Anyway, here is an example of what I would like to do:
> 
> #begin
> def foo(**kwargs): print kwargs
> 
> foo(a = 1, b = 2, c = 3)
> #end
> 
> 
> In the current implementation kwargs is a dict, but I need to have the
> keyword argument sorted.
> Unfortunately subclassing fron dict and installing the class in the
> __builtin__ module (with the name 'dict') does not work, CPython uses
> only builtin types.
> 
> With the compiler module I can obtain the keyword arguments in the
> order the were specified.
> The problem is how to do this for every call to foo!
> 
The nature of the interpreter is that the C code implementing function 
calls specifically uses a dict created in C rather than using the 
mechanisms that would be used to create a dict from within a python 
program, so you have no way to "hook" your own implementation in to the 
interpreter without modifying the C code.

Introspection does have its limits, and unfortunately that's one of 
them. Sine the code that interprets the byte codes is pretty much all 
written in C, there's no way to affect something that does not already 
have Python run-time hooks provided (such as the __add__ method that 
allows you to implement a specific response to the binary "+" operator).

What you probably need is a specific magic hook for the "**" operator, 
but I'm not sure that's going to happen any time soon ...

regards
  Steve
-- 
Meet the Python developers and your c.l.py favorites March 23-25
Come to PyCon DC 2005                      http://www.pycon.org/
Steve Holden                           http://www.holdenweb.com/



More information about the Python-list mailing list