Is there are good DRY fix for this painful design pattern?

Antoon Pardon antoon.pardon at vub.be
Mon Feb 26 10:00:28 EST 2018


On 26-02-18 15:41, Steven D'Aprano wrote:
> I have a class with a large number of parameters (about ten) assigned in 
> `__init__`. The class then has a number of methods which accept 
> *optional* arguments with the same names as the constructor/initialiser 
> parameters. If those arguments are None, the defaults are taken from the 
> instance attributes.
>
> An example might be something like this:
>
>
> class Foo:
>     def __init__(self, bashful, doc, dopey, grumpy, 
>                        happy, sleepy, sneezy):
>         self.bashful = bashful  # etc
>
>     def spam(self, bashful=None, doc=None, dopey=None, 
>                    grumpy=None, happy=None, sleepy=None,
>                    sneezy=None):
>         if bashful is None:
>             bashful = self.bashful
>         if doc is None:
>             doc = self.doc
>         if dopey is None:
>             dopey = self.dopey
>         if grumpy is None:
>             grumpy = self.grumpy
>         if happy is None:
>             happy = self.happy
>         if sleepy is None:
>             sleepy = self.sleepy
>         if sneezy is None:
>             sneezy = self.sneezy
>         # now do the real work...

Just throwing out an idea, but would it be possible to do what you want with
a decorator? You let the wrapper do this kind of control and then pass
control to the actual function with all values filled in?

I'll try to work something out later.

-- 
Antoon.





More information about the Python-list mailing list