TypeError:group_by_retval()缺少1个必需的仅限关键字参数:' grouper_func'

时间:2017-10-21 21:22:50

标签: python python-3.5

下面的人是我生成字典的代码:

import collections
from typing import Callable

def group_by_retval(*args, grouper_func: Callable[[], None]):
    my_list = []
    for elem in args:
        my_tr = grouper_func(elem)
        my_list.append([my_tr,elem])
    my_tuple = tuple(tuple(elem) for elem in my_list)
    my_diction = collections.defaultdict(list)
    for k,v in my_tuple:
        my_diction[k].append(v)
    return my_diction

我从python官方文档中读到,我可以在* args之后宣布可调用函数。如上。但是,当我运行如下的简单示例时,我收到了一个错误。有人可以帮我解决这个问题。感谢您阅读:

l = ["ab", 12, "cd", "d", 3]


print(group_by_retval(l, lambda x: isinstance(x, str)))

1 个答案:

答案 0 :(得分:1)

如评论中所述,在*arg(任意参数列表)之后,您只能使用keyword arguments

group_by_retval(l, grouper_func=lambda x: isinstance(x, str))

在没有提供名称的情况下执行此操作,您可以交换参数:

def group_by_retval(grouper_func: Callable[[], None], *args):
...

print(group_by_retval(lambda x: isinstance(x, str), l))

输出:

defaultdict(<class 'list'>, {False: [['ab', 12, 'cd', 'd', 3]]})

但事实上,你只需要使用任意参数列表,因为你的第一个参数是list。正确的解决方案

def group_by_retval(args, grouper_func: Callable[[], None]):
...
print(group_by_retval(l, lambda x: isinstance(x, str)))

输出:

defaultdict(<class 'list'>, {False: [12, 3], True: ['ab', 'cd', 'd']})