def METHOD_NAME(path: str) -> LUT1D | LUT3x1D:
    """
    Read given *Sony* *.spi1d* *LUT* file.
    Parameters
    ----------
    path
        *LUT* path.
    Returns
    -------
    :class:`colour.LUT1D` or :class:`colour.LUT3x1D`
        :class:`LUT1D` or :class:`LUT3x1D` class instance.
    Examples
    --------
    Reading a 1D *Sony* *.spi1d* *LUT*:
    >>> import os
    >>> path = os.path.join(
    ...     os.path.dirname(__file__),
    ...     "tests",
    ...     "resources",
    ...     "sony_spi1d",
    ...     "eotf_sRGB_1D.spi1d",
    ... )
    >>> print(read_LUT_SonySPI1D(path))
    LUT1D - eotf sRGB 1D
    --------------------
    <BLANKLINE>
    Dimensions : 1
    Domain     : [-0.1  1.5]
    Size       : (16,)
    Comment 01 : Generated by "Colour 0.3.11".
    Comment 02 : "colour.models.eotf_sRGB".
    Reading a 3x1D *Sony* *.spi1d* *LUT*:
    >>> path = os.path.join(
    ...     os.path.dirname(__file__),
    ...     "tests",
    ...     "resources",
    ...     "sony_spi1d",
    ...     "eotf_sRGB_3x1D.spi1d",
    ... )
    >>> print(read_LUT_SonySPI1D(path))
    LUT3x1D - eotf sRGB 3x1D
    ------------------------
    <BLANKLINE>
    Dimensions : 2
    Domain     : [[-0.1 -0.1 -0.1]
                  [ 1.5  1.5  1.5]]
    Size       : (16, 3)
    Comment 01 : Generated by "Colour 0.3.11".
    Comment 02 : "colour.models.eotf_sRGB".
    """
    title = path_to_title(path)
    domain_min, domain_max = np.array([0, 1])
    dimensions = 1
    data = []
    comments = []
    with open(path) as spi1d_file:
        lines = filter(None, (line.strip() for line in spi1d_file.readlines()))
        for line in lines:
            if line.startswith("#"):
                comments.append(line[1:].strip())
                continue
            tokens = line.split()
            if tokens[0] == "Version":
                continue
            if tokens[0] == "From":
                domain_min, domain_max = as_float_array(tokens[1:])
            elif tokens[0] == "Length":
                continue
            elif tokens[0] == "Components":
                component = as_int_scalar(tokens[1])
                attest(
                    component in (1, 3),
                    "Only 1 or 3 components are supported!",
                )
                dimensions = 1 if component == 1 else 2
            elif tokens[0] in ("{", "}"):
                continue
            else:
                data.append(tokens)
    table = as_float_array(data)
    LUT: LUT1D | LUT3x1D
    if dimensions == 1:
        LUT = LUT1D(
            np.squeeze(table),
            title,
            np.array([domain_min, domain_max]),
            comments=comments,
        )
    elif dimensions == 2:
        LUT = LUT3x1D(
            table,
            title,
            np.array(
                [
                    [domain_min, domain_min, domain_min],
                    [domain_max, domain_max, domain_max],
                ]
            ),
            comments=comments,
        )
    return LUT