On 12/2/2009 10:26 AM, allen.fowler wrote:
I've tried this, but have found two issues:

1) I can't set default values.
2) I can't set required values.

In both of the above cases, if the object is created without the
"exact" dict() I expect, all the assumption my methods make about what
is available in "self" fall apart.


You can inspect the dict, something like:

def __init__(self, **kwargs):
    required = ['p1', 'p2', 'p3']
    optional = {'p4': 'foo', 'p5': 'bar'}
    if any(par not in kwargs for par in required):
        raise TypeError('required parameter not set')
    for par in optional:
        if par not in kwargs:
            kwargs[par] = optional[par]
    # ... do work ...

Tips: turn this parameter checker into a @decorator

But generally, as Diez pointed out your class may be doing too much. Try splitting it into smaller classes. Passing too much parameter is an indication of a God Object (or demi-god) http://en.wikipedia.org/wiki/God_object "He" just knows too much.



===

Unpythonic warning: Java-style code would use several separate initializers that would be called in order before the object is in a ready state (but never in an invalid state [!]). The first initializer merely set all the attributes into some valid state. This is an *anti-pattern* in python. Avoid it.

def __init__(self):
    self.p1 = ''
    self.p2 = 0
    self.p3 = []
def init_name(self, name):
    self.p1 = name

etc, etc...

===
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to