1 # Copyright (c) 2009 David Aguilar
2 """Provides a serializable data container"""
6 from cola
import serializer
7 from cola
.compat
import set
9 class BaseModel(object):
10 def param_names(self
, export
=False):
11 """Returns a list of serializable attribute names.
14 >>> m._question = 'unknown'
20 >>> m.param_names(export=True)
21 ['_question', 'answer']
25 for k
, v
in self
.__dict
__.iteritems():
26 if is_atom(v
) or is_dict(v
) or is_seq(v
):
34 def has_param(self
,param
):
35 """Returns true if a parameter exists in a model.
39 >>> m.has_param('answer')
42 >>> m.has_param('question')
46 return param
in self
.__dict
__
48 def param(self
, param
, default
=None):
49 """Returns the value of a model parameter.
56 >>> m.param('another answer', 42)
59 return self
.__dict
__.get(param
, default
)
61 def __getattr__(self
, param
):
62 """Provides set_<attribute>(value) append methods.
64 This provides automatic convenience methods for handling
65 setattrs with notification.
70 >>> # Observers are notified
75 # Base case: we actually have this param
76 if param
in self
.__dict
__:
77 return getattr(self
, param
)
79 # Return a closure over param for calling set_param;
80 # Concrete classes subclass set_param to provide notification
81 if param
.startswith('set_'):
82 return lambda v
: self
.set_param(param
[4:], v
)
84 errmsg
= ("'%s' object has no attribute '%s'" %
85 (self
.__class
__.__name
__, param
))
86 raise AttributeError(errmsg
)
88 def set_param(self
, param
, value
):
89 """Wrapper around setattr()
93 >>> m.set_param('answer', 42)
98 setattr(self
, param
, value
)
100 def copy_params(self
, model
, params_to_copy
=None):
101 """Copies params from one model to another.
105 >>> m._question = 'unknown'
107 >>> m2.copy_params(m)
115 # Loop over all attributes and copy them over
116 for k
in params_to_copy
or model
.param_names(export
=True):
117 self
.__dict
__[k
] = copy
.copy(model
.__dict
__[k
])
121 return type(item
) is types
.DictType
125 return (type(item
) is types
.ListType
or
126 type(item
) is types
.TupleType
or
130 return(item
is None or
131 type(item
) in types
.StringTypes
or
132 type(item
) is types
.BooleanType
or
133 type(item
) is types
.IntType
or
134 type(item
) is types
.LongType
or
135 type(item
) is types
.FloatType
or
136 type(item
) is types
.ComplexType
)