I agree with you Steven that the OP should avoid __getattribute__ and the like for many a thing. I also agree with your last statement. I try to answer the OP's question without much "You shouldn't do this's and don't do that's". I trust them to make thier own decisions. I'd say "A much better solution..." is the way I like to say it.
The last solution you offered I find I use more often now as I like to set my function with default values for which I call set-and-forget function parms/args where using None is what allows my functions to know what is changing (or not). # for example def logger(parm1, parm2=None): if not hasattr(myfunc.parm2_default): if parm2: myfunc.parm2_default = parm2 else: myfunc.parm2_default = CONSOLE if not parm2: parmTwo = myfunc.parm2_default else: parmTwo = parm2 # do something print(parmTwo) log = logger(gui_frame, GUI) # an inaccurate example -- http://mail.python.org/mailman/listinfo/python-list