Queues the config sources to be read later (when config is accessed), or reads immediately if config has already
        been accessed.

        :param file/str/list sources: Config source string, file name, or file pointer, or list of the other sources.
                                      If file source does not exist, it is ignored.
        :return: True if all sources were successfully read or will be read, otherwise False

def read(self, sources):
        """
        Queues the config sources to be read later (when config is accessed), or reads immediately if config has already
        been accessed.

        :param file/str/list sources: Config source string, file name, or file pointer, or list of the other sources.
                                      If file source does not exist, it is ignored.
        :return: True if all sources were successfully read or will be read, otherwise False
        """

        all_read = True

        if not isinstance(sources, list):
            sources = [sources]

        if self._sources_read:
            for source in sources:
                all_read &= self._read(source)
        else:
            for i, source in enumerate(sources):
                if isinstance(source, IOBase):
                    sources[i] = source.read()
            self._sources.extend(sources)

        return all_read