Kay Schluehr wrote:
> Storing arguments away before they are evaluated doesn't work in
> Python. You have to hack the compiler in order to access the parsetree.
> You might take a look at the compiler package of the standard library
> that enables access to ASTs. Thus you could define lazy evaluation and
> just-in-time compilation of some particular ASTs. I do not recommend
> doing this for real purposes, but it is a good excercise and sooner or
> later you become an expert yourself :)
>
> Kay

I made some investigation and reached a (partial) solution to my
problem. It is inspired from a cookbook recipe but it only works for
generator expressions.:
import tokenize
import token
def magic_function(s):
        cursor = None   # to be set to the cursor of the connection
        return_type = object    # can be set to dict or list
        _iterating = False # used in next()
        readline = open(s.gi_frame.f_code.co_filename).readline
        first_line = s.gi_frame.f_code.co_firstlineno
        flag = False
        source = ''    # the source code
        for t in
tokenize.generate_tokens(open(s.gi_frame.f_code.co_filename).readline):
                # check all tokens until the last parenthesis is closed
                t_type,t_string,(r_start,c_start),(r_end,c_end),line = t
                t_name = token.tok_name[t_type]
                if r_start == first_line:
                        if t_name == 'NAME' and t_string=="magic_function":
                                flag = True
                                res = t_string
                                start = 0 # number of parenthesis
                                continue
                if flag:
                        source += ' '+t_string
                        if t_name == 'OP':
                                if t_string=='(':
                                        start += 1
                                elif t_string == ')':
                                        start -= 1
                                        if start == 0:
                                                break
        return source[2:-2]

assert magic_function(i+2 for i in [1,2])=="i+2 for i in [1,2]"
or
print magic_function(i+2 for i in [1,2])

A general solution is possible and i am sure there are people around
that will provide such a solution

Alain

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to