Read (section, param) from `config_obj`. If not found, return `default`

    If the setting is not found and `default` is None, then an warn-level message is logged.
    `config_filename` can be None, filepath or list of filepaths - it is only used for logging.

    If warn_on_none_level is None (or lower than the logging level) message for falling through to
        a `None` default will be suppressed.

def _raw_config_setting(config_obj, section, param, default=None, config_filename='', warn_on_none_level=logging.WARN):
    """Read (section, param) from `config_obj`. If not found, return `default`

    If the setting is not found and `default` is None, then an warn-level message is logged.
    `config_filename` can be None, filepath or list of filepaths - it is only used for logging.

    If warn_on_none_level is None (or lower than the logging level) message for falling through to
        a `None` default will be suppressed.
    """
    # noinspection PyBroadException
    try:
        return config_obj.get(section, param)
    except:
        if (default is None) and warn_on_none_level is not None:
            _warn_missing_setting(section, param, config_filename, warn_on_none_level)
        return default