Skip to content
GitLab
Explore
Sign in
Commits on Source (2)
*Fixed* string output for index assignments
· 3eceda0a
Martin Claus
authored
Oct 05, 2018
3eceda0a
Added example for merging two namelists
· 7aa86d68
Martin Claus
authored
Oct 05, 2018
7aa86d68
Show whitespace changes
Inline
Side-by-side
examples/merge_NEMO_namelists.py
0 → 100644
View file @
7aa86d68
from
context
import
namelist
in_file_ref
=
"
namelist_ref
"
in_file_cfg
=
"
namelist_cfg
"
with
open
(
in_file_ref
)
as
f
:
ref_nmls
=
namelist
.
parse_namelist_file
(
f
)
with
open
(
in_file_cfg
)
as
f
:
cfg_nmls
=
namelist
.
parse_namelist_file
(
f
)
nmls
=
ref_nmls
.
copy
()
for
k
in
cfg_nmls
:
if
k
in
nmls
:
nmls
[
k
].
update
(
cfg_nmls
[
k
])
else
:
nmls
[
k
]
=
cfg_nmls
[
k
]
for
nml
in
nmls
:
print
(
str
(
nmls
[
nml
]))
namelist/namelist.py
View file @
7aa86d68
...
...
@@ -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
)
...
...
tests/test_parsing.py
View file @
7aa86d68
...
...
@@ -58,6 +58,7 @@ def test_parse_file(string):
"
&nml
\n
val1 = .FALSE.
\n
/
\n
"
,
"
&nml
\n
val1 = (/ 1,2,3,4,5,6 /)
\n
/
\n
"
,
"
&nml
\n
val1 = (/ .TRUE.,.FALSE.,.TRUE.,.TRUE. /)
\n
/
\n
"
,
"
&nml
\n
val1 = 3
\n
val2 = 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
(
"
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
'
/
"
])
...
...