Limits of Metaprogramming
Wilson
PaulAlexWilson at gmail.com
Mon Aug 4 14:57:04 EDT 2008
On Aug 4, 6:49 pm, castironpi <castiro... at gmail.com> wrote:
> On Aug 4, 4:48 am, Wilson <PaulAlexWil... at gmail.com> wrote:
>
> > Hi all,
>
> > My problem is that I don't know if it's possible to edit these states
> > and then write them back to .py. Firstly, if my editing tool was to
> > create a new state, I would want to create the class (using type) and
> > attach it to the imported state module somehow. I can't find
>
> > Thanks,
> > Paul
>
> Yes it's possible, using type, but you can't attach it to the module
> in any persistent way. The next time you load the module, it's back
> to the way it was.
>
> I think this may be the hang-up in your design: if you think about
> generating lines of code directly from the user's actions, you might
> stay on the right track. At that point, you can place them in the .py
> file. Then you can reimport it, or just execute the new lines
> directly.
>
> If this is your class,
>
> class Auto54701:
> def next( self, input ):
> if( something ):
> return value1
> return value2
>
> Here's how to work with it at the interactive prompt:
>
> >>> s= """class Auto54701:
>
> ... def next( self, input ):
> ... if( something ):
> ... return value1
> ... return value2
> ... """>>> s
>
> 'class Auto54701:\n def next( self, input ):\n if( something ):
> \n ret
> urn value1\n return value2\n'>>> exec( s )
> >>> Auto54701
>
> <class __main__.Auto54701 at 0x00A80C60>
>
>
>
> And by the way, you can't use pickle to store types. There needs to
> be some fleshed-out code to back them up.
>
> Two more alternatives, which I can discuss more later, one where you
> implement code as data, but it ends up being a lot like Python
> anyway. It only works if your classes' methods are going to be
> simple, probably sequential if-s and assignments at most.
>
> class Auto54701:
> def next( self, input ):
> if( something1 ):
> return value1
> elif( something2 ):
> return value2
> elif( something3 ):
> return value3
> elif( something4 ):
> return value4
> return value5
>
> can be stored in data as
>
> [ ( something1, value1 ), ( something2, value2 ), ... ]
>
> , and just checked in a loop, that you only have in code once, rather
> than many times.
>
> class GenericAuto:
> def next( self, input ):
> for something, value in conditionpairs:
> if( something ):
> return value
> return valuen
>
> Two, if all your methods will have uniform signatures and closures,
> you can store class methods as only their co_code objects:
>
> >>> C.g.im_func.func_code.co_code
>
> 'd\x00\x00S'
>
> And fabricate them dynamically into full live types as needed.
Thanks for your comments and advice. This second option intrigues me;
could you elaborate further, I don't follow you...
Thanks Paul
More information about the Python-list
mailing list