Co-routines
Michael Chermside
mcherm at mcherm.com
Thu Jul 17 14:14:05 EDT 2003
Chris Wright wants a way to execute python code one-line-at-a-time so he
can run multiple functions "in lockstep".
I don't have an answer, but I have the START of an approach. Michael Sparks
is ahead of me here (see his excellent answer
http://mail.python.org/pipermail/python-list/2003-July/173694.html), but
for a different approach try this:
G:\>python
ActivePython 2.2.1 Build 222 (ActiveState Corp.) based on
Python 2.2.1 (#34, Apr 15 2002, 09:51:39) [MSC 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> def f():
... print '1-1'
... print '1-2'
... print '1-3'
...
>>> import dis
>>> dis.dis(f.func_code)
0 SET_LINENO 1
3 SET_LINENO 2
6 LOAD_CONST 1 ('1-1')
9 PRINT_ITEM
10 PRINT_NEWLINE
11 SET_LINENO 3
14 LOAD_CONST 2 ('1-2')
17 PRINT_ITEM
18 PRINT_NEWLINE
19 SET_LINENO 4
22 LOAD_CONST 3 ('1-3')
25 PRINT_ITEM
26 PRINT_NEWLINE
27 LOAD_CONST 0 (None)
30 RETURN_VALUE
Here we can SEE the code, and it's nicely broken into lines by
the SET_LINENO bytecode. What I'd LIKE to do now is to somehow
go from f.func_code (a code object) to a Python list of bytecodes.
Then we could easily split the list on SET_LINENO codes, intersperse
with calls to other functions, and sew it all up into a larger
list. Then we would just need to exec those bytecodes, and BINGO...
problem solved.
But I don't know how to convert a code object into a list of
bytecodes, nor how to convert it back to a code object so I can
pass it to exec.
Any better gurus able to enlighten me?
-- Michael Chermside
More information about the Python-list
mailing list