human
Can you provide a the Python code you requested given the following:
Complete the below
def has_dataproviders(cls):

    ''''Wraps a class (generally a Datatype), finds methods within that have been
    decorated with `@dataprovider` and adds them, by their name, to a map
    in the class.
    This allows a class to maintain a name -> method map, effectively
    \'registering\' dataprovider factory methods::
    @has_dataproviders
    class MyDtype( data.Data ):
    @dataprovider_factory( \'bler\' )
    def provide_some_bler( self, dataset, **settings ):
    \'\'\'blerblerbler\'\'\'
    dataset_source = providers.DatasetDataProvider( dataset )
    # ... chain other, intermidiate providers here
    return providers.BlerDataProvider( dataset_source, **settings )
    # use the base method in data.Data
    provider = dataset.datatype.dataprovider( dataset, \'bler\',
    my_setting=\'blah\', ... )
    # OR directly from the map
    provider = dataset.datatype.dataproviders[ \'bler\' ]( dataset,
    my_setting=\'blah\', ... )'
    '''
assistant
#Here is the Python code you requested.
    if (not hasattr(cls, _DATAPROVIDER_CLASS_MAP_KEY)):
        setattr(cls, _DATAPROVIDER_CLASS_MAP_KEY, {})
    else:
        existing_dataproviders = getattr(cls, _DATAPROVIDER_CLASS_MAP_KEY)
        copied_dataproviders = copy.deepcopy(existing_dataproviders)
        setattr(cls, _DATAPROVIDER_CLASS_MAP_KEY, copied_dataproviders)
    dataproviders = getattr(cls, _DATAPROVIDER_CLASS_MAP_KEY)
    for (attr_key, attr_value) in cls.__dict__.items():
        if (callable(attr_value) and (not attr_key.startswith('__')) and getattr(attr_value, _DATAPROVIDER_METHOD_NAME_KEY, None)):
            name = getattr(attr_value, _DATAPROVIDER_METHOD_NAME_KEY)
            dataproviders[name] = attr_value
    return cls