<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_buckets(self, bucket_type=None, timeout=None):
 """ Streams the list of buckets. This is a generator method that should be iterated over. .. warning:: Do not use this in production, as it requires traversing through all keys stored in a cluster. The caller should explicitly close the returned iterator, either using :func:`contextlib.closing` or calling ``close()`` explicitly. Consuming the entire iterator will also close the stream. If it does not, the associated connection might not be returned to the pool. Example:: from contextlib import closing # Using contextlib.closing with closing(client.stream_buckets()) as buckets: for bucket_list in buckets: do_something(bucket_list) # Explicit close() stream = client.stream_buckets() for bucket_list in stream: do_something(bucket_list) stream.close() :param bucket_type: the optional containing bucket type :type bucket_type: :class:`~riak.bucket.BucketType` :param timeout: a timeout value in milliseconds :type timeout: int :rtype: iterator that yields lists of :class:`RiakBucket <riak.bucket.RiakBucket>` instances """

        if not riak.disable_list_exceptions:
            raise ListError()

        _validate_timeout(timeout)

        if bucket_type:
            bucketfn = self._bucket_type_bucket_builder
        else:
            bucketfn = self._default_type_bucket_builder

        def make_op(transport):
            return transport.stream_buckets(
                    bucket_type=bucket_type, timeout=timeout)

        for bucket_list in self._stream_with_retry(make_op):
            bucket_list = [bucketfn(bytes_to_str(name), bucket_type)
                           for name in bucket_list]
            if len(bucket_list) > 0:
                yield bucket_list