コード例 #1
0
ファイル: test_hparams.py プロジェクト: sayoojbk/HParams
def test_merge_args__too_many_args():
    lambda_ = lambda a, b='abc': (a, b)
    parameters = list(inspect.signature(lambda_).parameters.values())

    # Test too many arguments passed
    with pytest.raises(TypeError):
        _merge_args(parameters, ['a', 'abc', 'one too many'], {}, {'b': 'xyz'}, {'b': 'abc'}, '')
コード例 #2
0
ファイル: test_hparams.py プロジェクト: sayoojbk/HParams
def test_merge_arg_kwarg(logger_mock, warnings_mock):
    """ Test `_merge_args` under the basic case with one argument and one keyword argument.
    """
    lambda_ = lambda a, b='abc': (a, b)
    parameters = list(inspect.signature(lambda_).parameters.values())

    # Prefer `args` over `other_kwargs`
    merged = _merge_args(parameters, ['a', 'abc'], {}, {'b': 'xyz'}, {}, '')
    assert merged == (['a', 'abc'], {})
    assert logger_mock.warning.call_count == 0
    assert warnings_mock.warn.call_count == 1
    warnings_mock.reset_mock()

    # Prefer `kwargs` over `other_kwargs`
    merged = _merge_args(parameters, ['a'], {'b': 'abc'}, {'b': 'xyz'}, {}, '')
    assert merged == (['a'], {'b': 'abc'})
    assert logger_mock.warning.call_count == 0
    assert warnings_mock.warn.call_count == 1
    warnings_mock.reset_mock()

    # Prefer `other_kwargs` over default argument
    merged = _merge_args(parameters, ['a'], {}, {'b': 'xyz'}, {'b': 'abc'}, '')
    assert merged == (['a'], {'b': 'xyz'})
    warnings_mock.warn.assert_not_called()
    warnings_mock.warn.assert_not_called()

    # Prefer default argument over nothing
    merged = _merge_args(parameters, ['a'], {}, {}, {'b': 'abc'}, '')
    assert merged == (['a'], {'b': 'abc'})
    warnings_mock.warn.assert_not_called()
    warnings_mock.warn.assert_not_called()
コード例 #3
0
ファイル: test_hparams.py プロジェクト: sayoojbk/HParams
def test_merge_arg_variable(logger_mock, warnings_mock):
    """ For arguments, order matters; therefore, unless we are able to abstract everything into a
    keyword argument, we have to keep the `args` the same.

    The case where we are unable to shift everything to `args` is when there exists a `*args`.
    For example (a, b) cannot be flipped with kwarg:
    >>> lambda_ = lambda a, b='abc': (a, b)
    >>> lambda_('b', a='a')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: <lambda>() got multiple values for argument 'a'
    """
    lambda_ = lambda a, *args, b='abc': (a, args, b)
    parameters = list(inspect.signature(lambda_).parameters.values())

    merged = _merge_args(parameters, ['a', 'b', 'c'], {}, {'b': 'xyz'}, {}, '')
    assert merged == (['a', 'b', 'c'], {'b': 'xyz'})
    logger_mock.warning.assert_not_called()
    warnings_mock.warn.assert_not_called()

    merged = _merge_args(parameters, ['a', 'b', 'c'], {}, {'a': 'xyz'}, {}, '')
    assert merged == (['a', 'b', 'c'], {})
    assert logger_mock.warning.call_count == 0
    assert warnings_mock.warn.call_count == 1
    warnings_mock.reset_mock()

    # More arguments than parameters
    merged = _merge_args(parameters, ['a', 'b', 'c', 'd', 'e', 'g'], {}, {'a': 'xyz'}, {}, '')
    assert merged == (['a', 'b', 'c', 'd', 'e', 'g'], {})
    assert logger_mock.warning.call_count == 0
    assert warnings_mock.warn.call_count == 1
コード例 #4
0
def test_merge_kwarg_variable(logger_mock):
    """ Test `_merge_args` under the basic case with a variable keyword argument.
    """
    lambda_ = lambda a, b, **kwargs: (a, b, kwargs)
    parameters = list(inspect.signature(lambda_).parameters.values())

    merged = _merge_args(parameters, ['a', 'b'], {}, {'b': 'xyz'}, {}, '', True)
    assert merged == (['a', 'b'], {})
    assert logger_mock.warning.call_count == 1
    logger_mock.reset_mock()

    merged = _merge_args(parameters, ['a'], {}, {'b': 'xyz'}, {}, '', True)
    assert merged == (['a'], {'b': 'xyz'})
    logger_mock.warning.assert_not_called()
    logger_mock.reset_mock()

    merged = _merge_args(parameters, ['a'], {}, {'b': 'xyz', 'c': 'abc'}, {}, '', True)
    assert merged == (['a'], {'b': 'xyz', 'c': 'abc'})
    logger_mock.warning.assert_not_called()
    logger_mock.reset_mock()