Problems with dynamic function creation.

Steven W. Orr steveo at syslang.net
Wed Aug 22 13:54:01 EDT 2007


I have some functions I need to create at runtime. The way I'm creating 
them is by calling a function which returns the string representation. 
Then I exec the string.

Here's the code I use to gen the strings:
mkfactfns.py
-----------
import new
def mkfactfns( cname ):
     def auxgen( name, params, dd ):
         v1 = ( """def mk%s%sdict(%s):\n"""%(name, cname, params)
                +
                """    print 'In mk%s%sdict'\n"""%(name, cname)
                +
                """    return %s\n"""%dd)
         v2 = ( """def mk%s%s(%s):\n"""%(name,cname,params)
                +
                """    print 'Calling mk%s%s'\n"""%(name,cname)
                +
                """    return %s%s( mk%s%sdict(%s) )\n"""%(name,cname, 
name, cname, params))
         return v1, v2
     return auxgen

This is  the caller of mkfactfns
--------------------------------
import mkfactfns
fbase = "ABC"   # Factory BASEname
auxfactgen = mkfactfns.mkfactfns(fbase)

Then in the same module, I call auxfactgen
via
     mkfactfns.AuxFnDefs( auxfndata, auxfactgen, globals(), "ABC" )

def AuxFnDefs(auxfndata, fnmaker, globs, cname ):
     dictsuff = ('dict','')
     for ii in auxfndata:
         rr = fnmaker( *ii )
         for jj in range( 2 ):
             co = compile (rr[jj], '', 'exec')
             exec co
             name = 'mk%s%s%s'%(ii[0],cname,dictsuff[jj])
             print 'co = ', co, 'name = ', name
             nfunc = new.function( co, globs, name )
             print 'Just added mk%s%s%s'%(ii[0],cname,dictsuff[jj])
             globs['mk%s%s%s'%(ii[0],cname,dictsuff[jj])] = nfunc
             print 'g = ', globs['mk%s%s%s'%(ii[0],cname,dictsuff[jj])]

Everything works just fine (that I know of) except that when I run a 
function that takes 1 arg, I get the following message:

TypeError: ?() takes no arguments (1 given)

even though I know that I am passing one arg. I must be doing something 
wrong, I just don't know what. :-(

-- 
Time flies like the wind. Fruit flies like a banana. Stranger things have  .0.
happened but none stranger than this. Does your driver's license say Organ ..0
Donor?Black holes are where God divided by zero. Listen to me! We are all- 000
individuals! What if this weren't a hypothetical question?
steveo at syslang.net



More information about the Python-list mailing list