diff --git a/pyccl/core.py b/pyccl/core.py index 58299897c..0cef01245 100644 --- a/pyccl/core.py +++ b/pyccl/core.py @@ -221,11 +221,12 @@ def write_yaml(self, filename): raise IOError("Unable to write YAML file {}".format(filename)) @classmethod - def read_yaml(cls, filename): + def read_yaml(cls, filename, **kwargs): """Read the parameters from a YAML file. Args: filename (:obj:`str`) Filename to read parameters from. + **kwargs (dict) Additional keywords that supersede file contents """ with open(filename, 'r') as fp: params = yaml.load(fp, Loader=yaml.Loader) @@ -256,6 +257,8 @@ def read_yaml(cls, filename): inits['m_nu'] = params['m_nu'] inits['m_nu_type'] = 'list' + inits.update(kwargs) + return cls(**inits) def _build_config( diff --git a/pyccl/tests/test_parameters.py b/pyccl/tests/test_parameters.py index 46a40bd47..83c8cf7c0 100644 --- a/pyccl/tests/test_parameters.py +++ b/pyccl/tests/test_parameters.py @@ -499,6 +499,18 @@ def test_parameters_read_write(): assert_almost_equal(params['Neff'], params2['Neff']) assert_almost_equal(params['sum_nu_masses'], params2['sum_nu_masses']) + # check overriding parameters with kwargs + params3 = ccl.Cosmology.read_yaml(temp_file_name, + matter_power_spectrum='emu', + n_s=1.1) + # check unmodified parameters are the same + assert_almost_equal(params['Omega_c'], params3['Omega_c']) + assert_almost_equal(params['Neff'], params3['Neff']) + # check new parameters and config correctly updated + assert_almost_equal(1.1, params3['n_s']) + assert_almost_equal(params['sum_nu_masses'], params3['sum_nu_masses']) + assert params3._config_init_kwargs['matter_power_spectrum'] == 'emu' + # Now make a file that will be deleted so it does not exist # and check the right error is raise with tempfile.NamedTemporaryFile(delete=True) as tmpfile: