.. automodule:: glom.matching
Contents
For matching whole data structures, use a :class:`~glom.Match` spec.
.. autoclass:: glom.Match :members:
Note that our four :class:`~glom.Match` rules above imply that
:class:`object` is a match-anything pattern. Because
isinstance(val, object)
is true for all values in Python,
object
is a useful stopping case. For instance, if we wanted to
extend an example above to allow additional keys and values in the
user dict above we could add :class:`object` as a generic pass through:
>>> target = [{'id': 1, 'email': '[email protected]', 'extra': 'val'}] >>> spec = Match([{'id': int, 'email': str, object: object}])) >>> assert glom(target, spec) == \\ ... [{'id': 1, 'email': '[email protected]', 'extra': 'val'}] True
The fact that {object: object}
will match any dictionary exposes
the subtlety in :class:`~glom.Match` dictionary evaluation.
By default, value match keys are required, and other keys are
optional. For example, 'id'
and 'email'
above are required
because they are matched via ==
. If either was not present, it
would raise class:~glom.MatchError. class:object however is matched
with func:isinstance(). Since it is not an value-match comparison,
it is not required.
This default behavior can be modified with :class:`~glom.Required` and :class:`~glom.Optional`.
.. autoclass:: glom.Optional
.. autoclass:: glom.Required
The most concise way to express validation and guards.
.. autodata:: glom.M
While M
is an easy way to construct expressions, sometimes a more
object-oriented approach can be more suitable.
.. autoclass:: glom.Or
.. autoclass:: glom.And
.. autoclass:: glom.Not
.. autoclass:: glom.Regex
Match becomes even more powerful when combined with the ability to branch spec execution.
.. autoclass:: glom.Switch
.. autoclass:: glom.MatchError
.. autoclass:: glom.TypeMatchError
Warning
Given the suite of tools introduced with :class:`~glom.Match`, the :class:`Check` specifier type may be deprecated in a future release.
.. autoclass:: glom.Check
.. autoclass:: glom.CheckError