card_file
Classes
CardFileDecoder
CardFileDecoder(include_positions: bool = False)
Bases: Transformer
Decoder performs translation from *.card file to a dictionary.
The translation rules are:
*.card |
Python | Comment |
|---|---|---|
| section | dict[str, dict] |
Top-level dicts are sections |
| key-value | dict |
Each item is a sigle kv pair |
| list | list |
Empty or with elements |
| nested list | list[list] |
List of lists |
| range | tuple[int] |
Integer range in the form: START:STEP:END |
| string | str |
Unquoted (with chars: -./${}*) and double quoted |
| integer number | int |
--- |
| real number | float |
Including scientific notation |
true/y |
True |
Case insensitive |
false/n |
False |
Case insensitive |
Empty/NONE |
None |
Empty value that acts like null |
Warning
CardFileDecoder works on items not belonging to any section, e.g. top-level key-value pairs. However, the load(s) functions require that a valid *.card file contains all keys inside some section.
Initialize CardFileDecoder.
Parameters:
-
(include_positionsbool, default:False) –include textual positions of keys and values (offset from the start)
Source code in ipsl_common/modipsl/card_file.py
275 276 277 278 279 280 281 | |
Methods:
decode
decode(text: str) -> dict[str, Any]
Decode *.card text into dictionary.
Parameters:
-
(textstr) –content of the
*.cardfile
Returns:
-
dict(dict[str, Any]) –Decoded
*.cardfile
Source code in ipsl_common/modipsl/card_file.py
283 284 285 286 287 288 289 290 291 292 293 | |
CardFileEncoder
CardFileEncoder(
truthy_value: str = "true",
falsey_value: str = "false",
encode_none_in_kv: bool = False,
)
Encoder translates Python dictionary to *.card file.
The translation rules are:
| Python | *.card |
Comment |
|---|---|---|
dict[str, dict] |
section | Top-level keys with dicts are sections |
dict |
key-value | Each item is a sigle kv pair |
list |
list | Empty or with elements |
list[list] |
nested list | List of lists |
tuple[int] |
range | Integer range in the form: START:STEP:END |
str |
string | Unquoted (with chars: -./${}*) and double quoted |
int |
integer number | --- |
float |
real number | Including scientific notation |
bool |
true/false |
Case insensitive |
None |
Empty/NONE |
Empty value that acts like null |
The translation is straightforward, based on Python type a specific conversion is performed.
No grammar, nor parse tree is used during this step. A null value, NONE in lists
is always encoded as NONE, so that the number of list elements is preserved. However,
a single key with NONE is encoded as a= by default. See :encode_none_in_kv
argument for more information.
Example:
from ipsl_common.modipsl.card_file import CardFileEncoder
text = CardFileEncoder().encode(dictionary)
If dictionary contains:
{
"UserChoices": {
"LMDZ_Physics": "NPv6.2"
},
"BoundaryFiles": {
"ListNonDel": [
["${R_IN}/ATM/INPUT_CE0L/Albedo4_deg.nc", "Albedo.nc"],
["${R_IN}/ATM/INPUT_CE0L/ECDYN4.nc", "ECDYN.nc"]
]
}
}
Then, the encoded *.card file would look as follows:
[UserChoices]
LMDZ_Physics = NPv6.2
[BoundaryFiles]
ListNonDel = (${R_IN}/ATM/INPUT_CE0L/Albedo4_deg.nc, Albedo.nc), (${R_IN}/ATM/INPUT_CE0L/ECDYN4.nc, ECDYN.nc)
Tip
Python representation of the *.card file doesn't contain any textual position of
particular elements (keys, values, comments, whitespaces, etc.), thus, re-encoding of
the exact input *.card file is impossible. In order to recreate the original file,
or modify a file while keeping the original comments, whitespaces, and order of elements,
use the designated modify functions.
Initialize CardFileEncoder.
Parameters:
-
(truthy_valuestr, default:'true') –label used to encode True
-
(falsey_valuestr, default:'false') –label used to encode False
-
(encode_none_in_kvbool, default:False) –encode null
NONEwith single key-values (e.g. a=NONE)
Source code in ipsl_common/modipsl/card_file.py
464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 | |
Methods:
encode
encode(obj: Any, _nested_list_indent=None) -> str
Encode dictionary or other Python object into *.card file.
Parameters:
-
(objAny) –dictionary or Python object
-
–_nested_list_indentinternal parameter used to indent nested lists, so that each sublist starts at the same position.
Returns:
-
str–Encoded text of a
*.deffile
Info
_nested_list_indent parameter is internal, even if set by the user,
it will be set again during the encoding to match the length of a key
with a nested list as its value.
Source code in ipsl_common/modipsl/card_file.py
481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 | |
Functions:
dump
dump(obj: dict, buffer: TextIOBase) -> None
Dump dictionary into *.card text/file buffer.
Parameters:
-
(objdict) –dictionary to dump to a file
-
(bufferTextIOBase) –text or file buffer for storing *.card file
Source code in ipsl_common/modipsl/card_file.py
53 54 55 56 57 58 59 60 61 62 | |
dumps
dumps(obj: dict) -> str
Dump dictionary into *.card string.
Parameters:
-
(objdict) –dictionary to dump to a file
Source code in ipsl_common/modipsl/card_file.py
65 66 67 68 69 70 71 | |
load
load(
buffer: TextIOBase, include_positions: bool = False
) -> dict
Load *.card text/file buffer into dictionary.
Parameters:
-
(bufferTextIOBase) –text or file buffer with the
*.cardfile -
(include_positionsbool, default:False) –include textual positions of elements (section, key, value)
Returns:
-
dict(dict) –Loaded
*.cardfile
Source code in ipsl_common/modipsl/card_file.py
16 17 18 19 20 21 22 23 24 25 26 27 28 | |
loads
loads(text: str, include_positions: bool = False) -> dict
Load *.card file string into dictionary.
Parameters:
-
(textstr) –content of the
*.cardfile -
(include_positionsbool, default:False) –include textual positions of elements (section, key, value)
Returns:
-
dict(dict) –Loaded
*.cardfile
Source code in ipsl_common/modipsl/card_file.py
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | |
modify
modify(
buffer: TextIOBase,
new_obj: dict,
buffer_out: TextIOBase | None = None,
insert_header: str = "",
) -> None
Modify *.card text/file buffer with minimal amount of changes.
The output text/file buffer follows changes made to new_obj representation of *.card file.
The modifications are performed, so that the minimal amount of changes is applied.
As a result, the diff between the old and new file content is minimal and no comments
or whitespaces are lost beyond what is neccessary. The new_obj can remove, modify,
and/or add new key-value pairs.
Parameters:
-
(bufferTextIOBase) –text or file buffer for reading the file (optionally to write to the file)
-
(new_objdict) –modified representation of the *.card file content
-
(buffer_outTextIOBase | None, default:None) –optional output buffer for writing the modified file content
-
(insert_headerstr, default:'') –optional header inserted before appended key-value pairs
Source code in ipsl_common/modipsl/card_file.py
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | |
modifys
modifys(
text: str, new_obj: dict, insert_header: str = ""
) -> str
Modify *.card file string with minimal amount of changes.
The output text follows changes made to new_obj representation of *.card file.
The modifications are performed, so that the minimal amount of changes is applied.
As a result, the diff between the old and new file content is minimal and no comments
or whitespaces are lost beyond what is neccessary. The new_obj can remove, modify,
and/or add new key-value pairs.
Parameters:
-
(textstr) –input text with *.card content to modify
-
(new_objdict) –modified representation of the *.card file content
-
(insert_headerstr, default:'') –optional header inserted before appended key-value pairs
Returns:
-
str(str) –Modified text
Source code in ipsl_common/modipsl/card_file.py
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 | |