code: def replace_vars(config, env):
    
    if isinstance(config, dict):
      for k, v in list(config.items()):
        if isinstance(v, dict) or isinstance(v, list) or isinstance(v, tuple):
          replace_vars(v, env)
        elif isinstance(v, basestring):
          config[k] = expand_var(v, env)
    elif isinstance(config, list):
      for i, v in enumerate(config):
        if isinstance(v, dict) or isinstance(v, list) or isinstance(v, tuple):
          replace_vars(v, env)
        elif isinstance(v, basestring):
          config[i] = expand_var(v, env)
    elif isinstance(config, tuple):
      # TODO(gram): figure out how to handle these if the tuple elements are scalar
      for v in config:
        if isinstance(v, dict) or isinstance(v, list) or isinstance(v, tuple):
          replace_vars(v, env)
docs: Replace variable references in config using the supplied env dictionary.
  
    Args:
      config: the config to parse. Can be a tuple, list or dict.
      env: user supplied dictionary.
  
    Raises:
      Exception if any variable references are not found in env.