Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is self.__dict__.update(**kwargs) good or poor style?

In Python, say I have some class, Circle, that inherits from Shape. Shape needs x- and y-coordinates, and, in addition, Circle needs a radius. I want to be able to initialize Circle by doing something like,

c = Circle(x=1., y=5., r=3.) 

Circle inherits from shape, so I need to use named arguments to __init__, because different classes require different constructors. I could manually set x, y, and r.

class Shape(object):     def __init__(self, **kwargs):         self.x = kwargs['x']         self.y = kwargs['y']  class Circle(Shape):     def __init__(self, **kwargs):         super(Circle, self).__init__(**kwargs)         self.r = kwargs['r'] 

or, I could have the attributes of my Circle set automatically using self.__dict__.update(kwargs)

class Shape(object):     def __init__(self, **kwargs):         self.__dict__.update(**kwargs)  class Circle(Shape):     def __init__(self, **kwargs):         super(Circle, self).__init__(**kwargs) 

The advantage of this is that there's less code and I don't need to maintain boilerplate like self.foo = kwargs['foo']. The disadvantage is that it isn't obvious which arguments are needed for Circle. Is this considered a cheat or is this good style (as long as the interface to Circle is well-documented)?


Thanks, everyone, for your thoughtful responses. The self.__dict__.update(**kwargs) hack has been useful for me in experimenting with organizing my code, but I'll make sure that I replace that with properly passing arguments explicitly and doing clear error checking in production code.

like image 753
Alex Szatmary Avatar asked Mar 15 '12 21:03

Alex Szatmary


1 Answers

class Shape(object):     def __init__(self, x=None, y=None):         self.x = x         self.y = y  class Circle(Shape):     def __init__(self, r=None, **kwargs):         super(Circle, self).__init__(**kwargs)         self.r = r 

And this is it. Don't use **kwargs when you don't really need them.

Is this considered a cheat or is this good style (as long as the interface to Circle is well-documented)?

When you have a choice between writing a simple, understandable code and headache code + nice docstrings, you actually don't have any choices, you just go and write simple, self-documented code:)

like image 166
Roman Bodnarchuk Avatar answered Sep 25 '22 13:09

Roman Bodnarchuk