<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def setup(config):
 """Setup persistence to be used in cinderlib. By default memory persistance will be used, but there are other mechanisms available and other ways to use custom mechanisms: - Persistence plugins: Plugin mechanism uses Python entrypoints under namespace cinderlib.persistence.storage, and cinderlib comes with 3 different mechanisms, "memory", "dbms", and "memory_dbms". To use any of these one must pass the string name in the storage parameter and any other configuration as keyword arguments. - Passing a class that inherits from PersistenceDriverBase as storage parameter and initialization parameters as keyword arguments. - Passing an instance that inherits from PersistenceDriverBase as storage parameter. """

    if config is None:
        config = {}
    else:
        config = config.copy()

    # Prevent driver dynamic loading clearing configuration options
    volume_cmd.CONF._ConfigOpts__cache = MyDict()

    # Default configuration is using memory storage
    storage = config.pop('storage', None) or DEFAULT_STORAGE
    if isinstance(storage, base.PersistenceDriverBase):
        return storage

    if inspect.isclass(storage) and issubclass(storage,
                                               base.PersistenceDriverBase):
        return storage(**config)

    if not isinstance(storage, six.string_types):
        raise exception.InvalidPersistence(storage)

    persistence_driver = driver.DriverManager(
        namespace='cinderlib.persistence.storage',
        name=storage,
        invoke_on_load=True,
        invoke_kwds=config,
    )
    return persistence_driver.driver