[Python-Dev] reducing self.x=x; self.y=y; self.z=z boilerplate code
Phillip J. Eby
pje at telecommunity.com
Sat Jul 2 01:22:20 CEST 2005
At 03:59 PM 7/1/2005 -0700, Ralf W. Grosse-Kunstleve wrote:
>Hi,
>
>I often find myself writing:
>
> class grouping:
>
> def __init__(self, x, y, z):
> self.x = x
> self.y = y
> self.z = z
>
>I hate it, and every time I show this to a Python newcomer I get that
>skeptic look. How about this for a change?
>
> class grouping:
>
> def __init__(self, .x, .y, .z):
> pass
This extends to any number of arguments:
class grouping:
def __init__(self, x, y, z):
self.__dict__.update(locals())
del self.self
Or if you prefer a more generic approach:
def initialize(ob, args):
if 'self' in args:
del args['self']
for k, v in args.items():
setattr(ob,k,v)
class grouping:
def __init__(self, x, y, z):
initialize(self, locals())
There's really no need for special syntax here, if your goal is simply to
reduce boilerplate.
>I'll write a PEP if I hear a few voices of support.
-1; there are lots of good solutions for this. For me, I usually have a
base class with something like this:
def __init__(self, **kw):
for k, v in kw.items():
if not hasattr(self.__class__, k):
raise TypeError("%s has no %r attribute" % (self.__class__,k))
else:
setattr(self,k,v)
And then subclasses define their attributes and defaults using class
attributes, properties, or other descriptors.
>(Otherwise I'll stick to my "adopt_init_args" workaround:
>http://phenix-online.org/cctbx_sources/libtbx/libtbx/introspection.py
>which does a similar job but doesn't look as elegant and is also
>quite inefficient).
There are more efficient solutions, especially __dict__.update().
More information about the Python-Dev
mailing list