diff --git a/namelist/namelist.py b/namelist/namelist.py index 5c14511023ca786566931b2908a99c856ebc32af..14dc5c89067ebc25b176547f78e8c81be77a31f4 100644 --- a/namelist/namelist.py +++ b/namelist/namelist.py @@ -62,8 +62,13 @@ class Namelist(DictClass): """ retstr = "&%s\n" % str(self.name) for k, v in self.items(): - if hasattr(v, '__iter__'): - retstr += "%s = (/ " % k + if hasattr(v, 'islower'): # is a string + retstr += "{} = {}\n".format(k, repr(v)) + elif hasattr(v, 'items'): # is a dictionary + for i, ival in v.items(): + retstr += "{}({}) = {}\n".format(k, i, repr(ival)) + elif hasattr(v, 'index'): # is an array + retstr += "{} = (/ ".format(k) tmpstr = "" for vv in v: if isinstance(vv, bool): @@ -226,7 +231,7 @@ def _add_value(container, value, key): # test if container is a dict like object container.keys() container[key] = value - except: # container is a list + except AttributeError: # container is a list container.append(value) diff --git a/tests/test_parsing.py b/tests/test_parsing.py index 6aeed30abe76cf81847b2eca713fd5ea9c4a65bf..0236f370e53eaa8790235fca310b15f54868f96e 100644 --- a/tests/test_parsing.py +++ b/tests/test_parsing.py @@ -58,6 +58,7 @@ def test_parse_file(string): "&nml\nval1 = .FALSE.\n/\n", "&nml\nval1 = (/ 1,2,3,4,5,6 /)\n/\n", "&nml\nval1 = (/ .TRUE.,.FALSE.,.TRUE.,.TRUE. /)\n/\n", + "&nml\nval1 = 3\nval2 = 5\n/\n", ] ) def test_string_out(string): @@ -189,6 +190,7 @@ def test_var_bool(string, val): ) def test_var_string(string, val): nml = namelist.parse_namelist_string(string)["nml"] + print(str(nml)) assert nml["val"] == val @@ -243,30 +245,41 @@ def test_index_assignment(string, val1, d): assert nml["val"] == d -@pytest.mark.parametrize("string", ["&nml {} /", "&nml {} val2=34 /"]) -@pytest.mark.parametrize("val1", ["lala", "((1 + 2) + 3)", 3, 3.0, 3e6, ".T."]) -@pytest.mark.parametrize("d", [{1: None, 2: 35},{1: None}]) +@pytest.mark.parametrize("string", ["&nml\n{}/\n", "&nml\n{}val2 = 34\n/\n"]) +@pytest.mark.parametrize( + "val1", + ["some_string", "((1 + 2) + 3)", 3, 3.0, 3e6, ".T."] +) +@pytest.mark.parametrize("d", [{1: None, 2: 35}, {1: None}]) def test_index_assignment_to_str(string, d, val1): - val_str = "" try: int(eval(val1)) is_expression = True - except: + except (NameError, SyntaxError, TypeError): is_expression = False is_bool = (val1 == ".T.") d[1] = val1 + val_str = "" for k, v in d.items(): if is_expression | is_bool: - val_str += "val({}) = {} ".format(k, v) + val_str += "val({}) = {}\n".format(k, v) else: - val_str += "val({}) = {} ".format(k, repr(v)) + val_str += "val({}) = {}\n".format(k, repr(v)) + nml_string = string.format(val_str) + nml = namelist.parse_namelist_string(nml_string)["nml"] + if is_expression: d[1] = eval(d[1]) if is_bool: d[1] = (val1 == ".T.") - nml_string = string.format(val_str) - nml = namelist.parse_namelist_string(nml_string)["nml"] - assert nml_string == str(nml) + valid_String = "" + for k, v in d.items(): + valid_String += "val({}) = {}\n".format(k, repr(v)) + valid_String = string.format(valid_String) + + print(valid_String, nml_string, str(nml)) + print(is_expression, is_bool) + assert valid_String == str(nml) @pytest.mark.parametrize("string", ["&nml val= {}, val2='lsl'/"])