'Initialisation of the parameter.
Create the parameter container for a stack from the stack name and
template, optionally setting the user-supplied parameter values.'

def __init__(self, stack_identifier, tmpl, user_params=None, param_defaults=None):

    user_params = (user_params or {})
    param_defaults = (param_defaults or {})
    def user_parameter(schema_item):
        (name, schema) = schema_item
        return Parameter(name, schema, user_params.get(name))
    self.tmpl = tmpl
    self.user_params = user_params
    schemata = self.tmpl.param_schemata()
    user_parameters = (user_parameter(si) for si in six.iteritems(schemata))
    pseudo_parameters = self._pseudo_parameters(stack_identifier)
    self.params = dict(((p.name, p) for p in itertools.chain(pseudo_parameters, user_parameters)))
    self.non_pseudo_param_keys = [p for p in self.params if (p not in self.PSEUDO_PARAMETERS)]
    for (pd_name, param_default) in param_defaults.items():
        if (pd_name in self.params):
            self.params[pd_name].set_default(param_default)
