def read(keypath, configfile=None):
    """
    Reads a value from the configuration file.

    Args:
      keypath: str
        Specifies the key for which the value is desired.  It can be a
        hierarchical path.  Example: "section1.subsection.key1"
      configfile: str
        Path to the config file to read.  Defaults to None, in which case
        the application's default config file is used.

    Returns:
      value from configuration file
    """
    if configfile in _configs:
        appconfig = _configs[configfile]
    else:
        appconfig = AppConfig(configfile=configfile)
        _configs[configfile] = appconfig

    return appconfig.read(keypath)
Reads a value from the configuration file.

    Args:
      keypath: str
        Specifies the key for which the value is desired.  It can be a
        hierarchical path.  Example: "section1.subsection.key1"
      configfile: str
        Path to the config file to read.  Defaults to None, in which case
        the application's default config file is used.

    Returns:
      value from configuration file