@classmethod
def from_str_or_key(cls, value, drop=[], append=[], tag=None):
    """Return a new Key from *value*.

        Parameters
        ----------
        value : str or Key
            Value to use to generate a new Key.
        drop : list of str, optional
            Existing dimensions of *value* to drop. See :meth:`drop`.
        append : list of str, optional.
            New dimensions to append to the returned Key. See :meth:`append`.
        tag : str, optional
            Tag for returned Key. If *value* has a tag, the two are joined
            using a '+' character. See :meth:`add_tag`.

        Returns
        -------
        :class:`Key`
        """
    if isinstance(value, cls):
        base = value
    else:
        name, *dims = value.split(':')
        _tag = dims[1] if len(dims) == 2 else None
        dims = dims[0].split('-') if len(dims) else []
        base = cls(name, dims, _tag)
    return base.drop(*(base.dims if drop is True else drop)).append(*append
        ).add_tag(tag)
