def matches(value, pattern):
    """Check whether `value` matches `pattern`.

    Parameters
    ----------
    value : ast.AST
    pattern : ast.AST

    Returns
    -------
    matched : bool
    """
    # types must match exactly
    if type(value) != type(pattern):
        return False

    # primitive value, such as None, True, False etc
    if not isinstance(value, ast.AST) and not isinstance(pattern, ast.AST):
        return value == pattern

    fields = [
        (field, getattr(pattern, field))
        for field in pattern._fields
        if hasattr(pattern, field)
    ]
    for field_name, field_value in fields:
        if not matches(getattr(value, field_name), field_value):
            return False
    return True
Check whether `value` matches `pattern`.

    Parameters
    ----------
    value : ast.AST
    pattern : ast.AST

    Returns
    -------
    matched : bool