如何将关键字参数传递到函数 `_extract_celery_task_args(*args: tuple, **kwargs: dict)` 中?

问题描述 投票:0回答:1

所以我有以下函数正在尝试进行单元测试:

def _extract_celery_task_args(*args: tuple, **kwargs: dict):
    ....

我尝试过类似的事情:

def test_extract_celery_task_args_max_four_args(mock_ConvertToParsingIntDate):
    args = ('task', 'parser_code', 'group_name', 'date')
    kwargs = {'mic': 'XEUR', 'something': 'else'}

    try:
        _extract_celery_task_args(args, kwargs)

    except ValueError as ve:
        assert False, ("More than 4 positional arguments passed to _extract_celery_task_args"
                       "function")

但是当我在

_extract_celery_task_args
内设置断点并打印出
args
kwargs
时,我得到:

args = (('task', 'parser_code', 'group_name', 'date'), {'mic': 'XEUR', 'something': 'else'})
kwargs = {}

我是不是传错了

kwargs

python arguments
1个回答
-1
投票

您似乎在测试中正确传递了 args 和 kwargs 参数,但在 _extract_celery_task_args 函数中定义 args 参数的方式存在问题。 *args 参数用于将任何其他位置参数收集为元组,而 **kwargs 参数将关键字参数收集为字典。在您的测试中,您已经分别将 args 和 kwargs 作为元组和字典传递,因此无需在函数定义中使用 * 和 ** 解包运算符。

您需要在测试模式下删除这些*和**,或者重写您的测试。

以下是修改 _extract_celery_task_args 函数定义的方法:

def _extract_celery_task_args(args: tuple, kwargs: dict):
    # Your function logic here

如果您想在 _extract_celery_task_args 函数中保留 *args 和 **kwargs 语法,您应该相应地调整您的测试。在这种情况下,您需要使用正确的解包语法传递参数。以下是如何修改测试以使用现有函数定义:

def test_extract_celery_task_args_max_four_args(mock_ConvertToParsingIntDate):
    args = ('task', 'parser_code', 'group_name', 'date')
    kwargs = {'mic': 'XEUR', 'something': 'else'}

    try:
        _extract_celery_task_args(*args, **kwargs)

    except ValueError as ve:
        assert False, ("More than 4 positional arguments passed to _extract_celery_task_args"
                       " function")

在此修改后的测试中,在调用 _extract_celery_task_args 时,*args 和 **kwargs 分别用于解压 args 元组和 kwargs 字典中的值。这样,您的函数将以 *args 和 **kwargs 参数的预期格式接收参数,并且您的测试应该按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.