Skip to content

match.py

Match(io=None)

Match(
    io: Input[Tkey] | IO[Tkey],
) -> MatchOnLoad[Tval, Tkey]
Match() -> MatchOnSave[Tval, Tkey]

Utility IO that allows dynamic switching between IO, like the match-case statement in Python.

Example:

>>> from ordeq_common import Static, Match
>>> from ordeq_args import EnvironmentVariable
>>> import os
>>> Country = (
...     Match(EnvironmentVariable("COUNTRY"))
...     .Case("NL", Static("Netherlands"))
...     .Case("BE", Static("Belgium"))
...     .Default(Static("Unknown"))
... )
>>> os.environ["COUNTRY"] = "NL"
>>> Country.load()
'Netherlands'

If a default is provided, it will be used when no cases match:

>>> os.environ["COUNTRY"] = "DE"
>>> Country.load()
'Unknown'

Otherwise, it raises an error when none of the provided cases are matched:

>>> Match(EnvironmentVariable("COUNTRY")).load()  # doctest: +IGNORE_EXCEPTION_DETAIL
Traceback (most recent call last):
...
ordeq.framework.io.IOException: Failed to load
Unsupported case 'DE'

Match on save works as follows:

>>> SmallOrLarge = (
...     Match()
...     .Case("S", EnvironmentVariable("SMALL"))
...     .Case("L", EnvironmentVariable("LARGE"))
...     .Default(EnvironmentVariable("UNKNOWN"))
... )
>>> SmallOrLarge.save(("S", "Andorra"))
>>> SmallOrLarge.save(("L", "Russia"))
>>> SmallOrLarge.save(("XXL", "Mars"))
>>> os.environ["SMALL"]
'Andorra'
>>> os.environ.get("LARGE")
'Russia'
>>> os.environ.get("UNKNOWN")
'Mars'

Example in a node:

>>> from ordeq import node
>>> from ordeq_files import JSON
>>> from ordeq_args import CommandLineArg
>>> from pathlib import Path
>>> TestOrTrain = (
...     Match(CommandLineArg("--split"))
...     .Case("test", JSON(path=Path("to/test.json")))
...     .Case("train", JSON(path=Path("to/train.json")))
... )
>>> @node(
...     inputs=TestOrTrain,
...     outputs=...,
... )
... def evaluate(data: dict) -> dict:
...     ...

Returns:

Type Description
MatchOnLoad | MatchOnSave

MatchOnLoad or MatchOnSave