Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamic/runtime method creation (code generation) in Python

I need to generate code for a method at runtime. It's important to be able to run arbitrary code and have a docstring.

I came up with a solution combining exec and setattr, here's a dummy example:

class Viking(object):     def __init__(self):         code = '''             def dynamo(self, arg):                 """ dynamo's a dynamic method!                 """                 self.weight += 1                 return arg * self.weight             '''         self.weight = 50          d = {}         exec code.strip() in d         setattr(self.__class__, 'dynamo', d['dynamo'])   if __name__ == "__main__":     v = Viking()     print v.dynamo(10)     print v.dynamo(10)     print v.dynamo.__doc__ 

Is there a better / safer / more idiomatic way of achieving the same result?

like image 807
Eli Bendersky Avatar asked Feb 10 '09 17:02

Eli Bendersky


People also ask

How do I generate a python code automatically?

You can create a generator model with the YAKINDU Statechart generator model wizard by selecting File → New → Code generator model. The code generation is performed automatically whenever the statechart or the generator file is modified. See also chapter Running a generator for more information.


1 Answers

Based on Theran's code, but extending it to methods on classes:

   class Dynamo(object):     pass  def add_dynamo(cls,i):     def innerdynamo(self):         print "in dynamo %d" % i     innerdynamo.__doc__ = "docstring for dynamo%d" % i     innerdynamo.__name__ = "dynamo%d" % i     setattr(cls,innerdynamo.__name__,innerdynamo)  for i in range(2):     add_dynamo(Dynamo, i)  d=Dynamo() d.dynamo0() d.dynamo1()   

Which should print:

  in dynamo 0 in dynamo 1  
like image 101
John Montgomery Avatar answered Sep 21 '22 08:09

John Montgomery