diff --git a/python/damask/_config.py b/python/damask/_config.py index db215b097..25fcbfa75 100644 --- a/python/damask/_config.py +++ b/python/damask/_config.py @@ -2,6 +2,7 @@ import copy from io import StringIO from collections.abc import Iterable import abc +import platform from typing import Optional, Union, Dict, Any, Type, TypeVar import numpy as np @@ -69,13 +70,30 @@ class Config(dict): **kwargs: arbitray keyword-value pairs, optional Top level entries of the configuration. - """ - if isinstance(config,str): - kwargs.update(yaml.load(config, Loader=SafeLoader)) - elif isinstance(config,dict): - kwargs.update(config) + Notes + ----- + Values given as keyword-value pairs take precedence + over entries with the same keyword in 'config'. + + """ + if int(platform.python_version_tuple()[1]) >= 9: + if isinstance(config,str): + kwargs = yaml.load(config, Loader=SafeLoader) | kwargs + elif isinstance(config,dict): + kwargs = config | kwargs # type: ignore + + super().__init__(**kwargs) + else: + if isinstance(config,str): + c = yaml.load(config, Loader=SafeLoader) + elif isinstance(config,dict): + c = config.copy() + else: + c = {} + c.update(kwargs) + + super().__init__(**c) - super().__init__(**kwargs) def __repr__(self) -> str: """ diff --git a/python/tests/test_Config.py b/python/tests/test_Config.py index 0fce31106..ebf5ec9a8 100644 --- a/python/tests/test_Config.py +++ b/python/tests/test_Config.py @@ -7,6 +7,17 @@ from damask import Orientation class TestConfig: + def test_init_keyword(self): + assert Config(p=4)['p'] == 4 + + @pytest.mark.parametrize('config',[{'p':1},'{p: 1}']) + def test_init_config(self,config): + assert Config(config)['p'] == 1 + + @pytest.mark.parametrize('config',[{'p':1},'{p: 1}']) + def test_init_both(self,config): + assert Config(config,p=2)['p'] == 2 + @pytest.mark.parametrize('flow_style',[None,True,False]) def test_load_save_str(self,tmp_path,flow_style): config = Config() @@ -36,7 +47,6 @@ class TestConfig: assert (config | Config(dummy)).delete({ 'hello':1,'foo':2 }) == config assert (config | Config(dummy)).delete(Config({'hello':1 })) == config | {'foo':'bar'} - def test_repr(self,tmp_path): config = Config() config['A'] = 1