def __init__(self, fields):
        """
        Parameters
        ----------
        fields : Sequence
            A sequence of field descriptions, which is a 2-tuple-like object
            containing `(name, type)`, where `name` is a `str` for the field
            name, and `type` is a numba type for the field type.
        """

        def check_field_pair(fieldpair):
            name, typ = fieldpair
            if not isinstance(name, str):
                msg = "expecting a str for field name"
                raise ValueError(msg)
            if not isinstance(typ, Type):
                msg = "expecting a Numba Type for field type"
                raise ValueError(msg)
            return name, typ

        fields = tuple(map(check_field_pair, fields))
        self._fields = tuple(map(check_field_pair,
                                 self.preprocess_fields(fields)))
        self._typename = self.__class__.__qualname__
        name = f"numba.{self._typename}{self._fields}"
        super().__init__(name=name)

        Parameters
        ----------
        fields : Sequence
            A sequence of field descriptions, which is a 2-tuple-like object
            containing `(name, type)`, where `name` is a `str` for the field
            name, and `type` is a numba type for the field type.
        
numba/core/types/containers.py