how to dynamically create a function object (from a code object)?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Petri Savolainen

    how to dynamically create a function object (from a code object)?

    After reading the manuals and googling around a bit, I thought I'd use
    the 'compile' built-in to create a code object. Then, using either
    new.function() or types.FunctionT ype(), create a function object out of
    the code object. The function object can then be turned into a method
    for example using types.MethodTyp e(). Right? Well, on Windows 98, using
    python 2.2.2 (or 2.3b2):
    [color=blue][color=green][color=darkred]
    >>> c=compile('def a(msg): return msg','<nowhere> ','exec')
    >>> f=types.Functio nType(c,globals (),'a')
    >>> f
    >>> <code object ? at 00F8A9E0, file "<nowhere>" , line 1>
    >>> f('hello')[/color][/color][/color]

    Traceback (most recent call last):
    File "<pyshell#136>" , line 1, in -toplevel-
    f('hello')
    TypeError: ?() takes no arguments (1 given)
    [color=blue][color=green][color=darkred]
    >>> f()
    >>>
    >>> a('hello')
    >>> 'hello'
    >>>[/color][/color][/color]

    This is, well, not what I would have expected.

    After peeking around in the code object, I found out its 'co_const'
    instance variable also contains a code object - which, it seems, should
    really be fed to the function creation methods:
    [color=blue][color=green][color=darkred]
    >>> c.co_consts[/color][/color][/color]
    (<code object a at 00F8A960, file "<nowhere>" , line 1>, None)[color=blue][color=green][color=darkred]
    >>> f=types.Functio nType(c.co_cons ts[0],globals(),'a')
    >>> f('hello')[/color][/color][/color]
    'hello'[color=blue][color=green][color=darkred]
    >>>[/color][/color][/color]

    Which is the behaviour I would have expected in the first place!

    I would really like to know what I am doing wrong here, or any
    clarification regarding what is going on above... I dare not hope having
    found a bug :-P

    Thanks,

    Petri

Working...