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'}, '')
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()
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
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()