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. > This is what I came up with at short notice:
def passthrough(func): def wrapper(self, **kwds): for argn in "bashful doc dopey grumpy happy sleepy sneezy".split(): if argn not in kwds: kwds[argn] = getattr(self, argn) func(self, **kwds) return wrapper class Foo: def __init__(self, bashful, doc, dopey, grumpy, happy, sleepy, sneezy): self.bashful = bashful self.doc = doc self.dopey = dopey self.grumpy = grumpy self.happy = happy self.sleepy = sleepy self.sneezy = sneezy @passthrough def spam(self, bashful=None, doc=None, dopey=None, grumpy=None, happy=None, sleepy=None, sneezy=None): print(bashful, doc, dopey, grumpy, happy, sleepy, sneezy) foo = Foo('a', 'b', 'c', 'd', 'e', 'f', 'g') foo.spam(happy = 1) # prints => a b c d 1 f g -- https://mail.python.org/mailman/listinfo/python-list