<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def import_args_from_dict(value, args, config):
 """Replaces some arguments by those specified by a key-value dictionary. This function will be recursively called on a dictionary looking for any value containing a "$" variable. If found, the value will be replaced by the attribute in "args" of the same name. It is used to load arguments from the CLI and any extra configuration parameters passed in recipes. Args: value: The value of a {key: value} dictionary. This is passed recursively and may change in nature: string, list, or dict. The top-level variable should be the dictionary that is supposed to be recursively traversed. args: A {key: value} dictionary used to do replacements. config: A dftimewolf.Config class containing configuration information Returns: The first caller of the function will receive a dictionary in which strings starting with "@" are replaced by the parameters in args. """

  if isinstance(value, six.string_types):
    for match in TOKEN_REGEX.finditer(str(value)):
      token = match.group(1)
      if token in args:
        actual_param = args[token]
        if isinstance(actual_param, six.string_types):
          value = value.replace("@"+token, args[token])
        else:
          value = actual_param
  elif isinstance(value, list):
    return [import_args_from_dict(item, args, config) for item in value]
  elif isinstance(value, dict):
    return {
        key: import_args_from_dict(val, args, config)
        for key, val in value.items()
    }
  elif isinstance(value, tuple):
    return tuple(import_args_from_dict(val, args, config) for val in value)
  return value