'Make a copy of this `Parameter`, overriding any of its core attributes
in the process (or an exact copy).
The arguments to this method are the same as those for the `Parameter`
initializer.  This simply returns a new `Parameter` instance with any
or all of the attributes overridden, and so returns the equivalent of:
.. code:: python
Parameter(self.name, self.description, ...)'

def copy(self, name=None, description=None, default=None, unit=None, getter=None, setter=None, fixed=False, tied=False, min=None, max=None, bounds=None):

    kwargs = locals().copy()
    del kwargs[u'self']
    for (key, value) in six.iteritems(kwargs):
        if (value is None):
            if (key in (u'min', u'max')):
                continue
            elif hasattr(self, key):
                value = getattr(self, key)
            elif hasattr(self, (u'_' + key)):
                value = getattr(self, (u'_' + key))
            kwargs[key] = value
    return self.__class__(**kwargs)
