Proposal: reducing self.x=x; self.y=y; self.z=z boilerplate code

Ralf W. Grosse-Kunstleve rwgk at yahoo.com
Mon Jul 11 15:51:48 EDT 2005


--- Robert Williscroft <rtw at freenet.co.uk> wrote:

> My apologies for having to resort to email but for some reason I can't post
> this message to comp.lang.python. I've tried about 4 times including 
> starting a
> new thread, but for some reason it doesn't turn up, though I've followed 
> up on
> another thread without problem.

Very strange. I hope it is not a conspiracy! :)
You can email to the list directly (that's what I am doing):

  python-list at python.org

>  > Is there a way out with Python as-is?
>  > -------------------------------------
>  >
>  > Yes. If you take the time to look at the file in the CVS you'll find
>  > that I was cheating a bit. To reduce the terrible clutter above, I am
>  > actually using a simple trick::
>  >
>  >     adopt_init_args(self, locals())
>  >
> 
> Also there is a decorator solution:
> 
> def init_self( init ):
>     vn = init.func_code.co_varnames[ 1 : init.func_code.co_argcount ]
>    
>     def decorated_init(self, *args, **kw):
>         off = 0
>         for name in vn:
>             if not name.startswith('_'):
>                 if name in kw:
>                     value = kw[name]
>                 else:
>                     value = args[off]
>                     off += 1
>                    
>                 setattr( self, name, value )
>            
>         init( self, *args, **kw )
>     return decorated_init
>                
> 
> class MyClass(object):
>     __slots__ = ['x', 'z']
> 
>     @init_self
>     def __init__( self, x, _y, z ):
>         pass
> 
>     def show( self ):
>         for i in self.__slots__:
>             print 'self.%s = %d' %(i,eval('self.%s' % (i,)))
> 
> MyClass( 1, 2, 3 ).show()
> 
> MyClass( z = 1, x = 2, _y = 3 ).show()
> 
> The __slots__ is in the test just because you mentioned you like it,
> the decorator doesn't need a "slots" class.
> 
> AFAICT this differs from your proposal in that in your proposal you
> want to use '.' as an include prefix the above uses '_' as an exclude
> prefix.
> 
> Rob.

I like the looks of the decorator approach a lot. Could this somehow be
enhanced such that the user doesn't have to know about the underscore? Thinking
about runtime efficiency, could the decorator approach somehow achieve that the
attribute-to-be arguments are never added to locals()?

Cheers,
        Ralf


		
____________________________________________________
Sell on Yahoo! Auctions – no fees. Bid on great items.  
http://auctions.yahoo.com/



More information about the Python-list mailing list