<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def stream_info(self) -> None: """Check and report source names, dtypes and shapes of all the streams available."""

        stream_names = [stream_name for stream_name in dir(self)
                        if 'stream' in stream_name and stream_name != 'stream_info']
        logging.info('Found %s stream candidates: %s', len(stream_names), stream_names)
        for stream_name in stream_names:
            try:
                stream_fn = getattr(self, stream_name)
                logging.info(stream_name)
                batch = next(iter(stream_fn()))
                rows = []
                for key, value in batch.items():
                        try:
                            value_arr = np.array(value)
                            row = [key, value_arr.dtype, value_arr.shape]
                            if value_arr.dtype.kind in 'bui':  # boolean, unsigned, integer
                                row.append('{} - {}'.format(value_arr.min(), value_arr.max()))
                            elif value_arr.dtype.kind is 'f':
                                row.append('{0:.2f} - {1:.2f}'.format(value_arr.min(), value_arr.max()))
                        except ValueError:  # np broadcasting failed (ragged array)
                            value_arr = None
                            row = [key, '{}'.format(type(value[0]).__name__), '({},)'.format(len(list(value)))]

                        if value_arr is None or \
                                (value_arr.ndim > 0 and value_arr.shape[1:] != np.array(value_arr[0]).shape):
                            logging.warning('*** stream source `%s` appears to be ragged (non-rectangular) ***', key)

                        rows.append(row)
                for line in tabulate.tabulate(rows, headers=['name', 'dtype', 'shape', 'range'],
                                              tablefmt='grid').split('\n'):
                    logging.info(line)
            except Exception:
                logging.warning('Exception was raised during checking stream `%s`, '
                                '(stack trace is displayed only with --verbose flag)', stream_name)
                logging.debug(traceback.format_exc())