Skip to content

Commit fa9e1b5

Browse files
authored
add flag to disable checking in variables are present (#93)
* add flag to disable checking in variables are present * add test and docstring entry
1 parent 4336bb1 commit fa9e1b5

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

src/arviz_base/utils.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def _check_tilde_start(x):
1010
return bool(isinstance(x, str) and x.startswith("~"))
1111

1212

13-
def _var_names(var_names, data, filter_vars=None):
13+
def _var_names(var_names, data, filter_vars=None, check_if_present=True):
1414
"""Handle var_names input across arviz.
1515
1616
Parameters
@@ -22,6 +22,9 @@ def _var_names(var_names, data, filter_vars=None):
2222
interpret var_names as substrings of the real variables names. If "regex",
2323
interpret var_names as regular expressions on the real variables names. A la
2424
`pandas.filter`.
25+
check_if_present : bool, optional
26+
If True (default), raise an error if any of the var_names is not present in
27+
the data. If False, ignore missing var_names.
2528
2629
Returns
2730
-------
@@ -52,14 +55,20 @@ def _var_names(var_names, data, filter_vars=None):
5255
)
5356

5457
try:
55-
var_names = _subset_list(var_names, all_vars, filter_items=filter_vars, warn=False)
58+
var_names = _subset_list(
59+
var_names,
60+
all_vars,
61+
filter_items=filter_vars,
62+
warn=False,
63+
check_if_present=check_if_present,
64+
)
5665
except KeyError as err:
5766
msg = " ".join(("var names:", f"{err}", "in dataset"))
5867
raise KeyError(msg) from err
5968
return var_names
6069

6170

62-
def _subset_list(subset, whole_list, filter_items=None, warn=True):
71+
def _subset_list(subset, whole_list, filter_items=None, warn=True, check_if_present=True):
6372
"""Handle list subsetting (var_names, groups...) across arviz.
6473
6574
Parameters
@@ -125,7 +134,7 @@ def _subset_list(subset, whole_list, filter_items=None, warn=True):
125134
subset = [item for item in whole_list for name in subset if re.search(name, item)]
126135

127136
existing_items = np.isin(subset, whole_list)
128-
if not np.all(existing_items):
137+
if check_if_present and not np.all(existing_items):
129138
raise KeyError(f"{np.array(subset)[~existing_items]} are not present")
130139

131140
return subset

src/arviz_base/utils.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ def _var_names(
1515
var_names: str | list | None,
1616
data: xarray.Dataset | Sequence[xarray.Dataset],
1717
filter_vars: Literal[None, "like", "regex"] | None = ...,
18+
check_if_present: bool = ...,
1819
) -> list | None: ...
1920
def _subset_list(
2021
subset: str,
2122
whole_list: list,
2223
filter_items: Literal[None, "like", "regex"] | None = ...,
2324
warn=...,
25+
check_if_present=...,
2426
) -> list | None: ...
2527
def _get_coords(
2628
data: xarray.DataArray, coords: dict[Hashable, ArrayLike]

tests/test_utils.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@ def test_var_names_key_error(data):
5858
_var_names(["theta", "tau", "bad_var_name"], data)
5959

6060

61+
def test_var_names_skip_check_if_present(data):
62+
assert _var_names(["theta", "tau", "bad_var_name"], data, check_if_present=False) == [
63+
"theta",
64+
"tau",
65+
"bad_var_name",
66+
]
67+
68+
6169
@pytest.mark.parametrize(
6270
"var_args",
6371
[

0 commit comments

Comments
 (0)