我可以在列表理解中使用 kwargs 吗?

Gui*_*ter 1 python list-comprehension

我正在使用一些旧的函数(试图改进旧的代码),然后我开始想知道是否可以直接在列表理解中使用 kwargs。

例如,我有这个数据集:

data = {"channels": [
    {"channel_id": 1, "group_id": 1, "description": "First", "default_msg": "Hi!", "status": True},
    {"channel_id": 2, "group_id": 1, "description": "Second", "default_msg": "Hi!", "status": True},
    {"channel_id": 3, "group_id": 1, "description": "Third", "default_msg": "Hi!", "status": False},
    {"channel_id": 4, "group_id": 2, "description": "Fourth", "default_msg": "Hi!", "status": True},
    {"channel_id": 5, "group_id": 2, "description": "Fifth", "default_msg": "Hi!", "status": False},
]}
Run Code Online (Sandbox Code Playgroud)

我可以轻松地做类似的事情:

def get_by_groups(group):
    return [c for c in data["channels"] if c["group_id"] == group]
Run Code Online (Sandbox Code Playgroud)

但是通过 kwargs 接收查询参数并直接在列表理解中使用它的想法看起来很神奇。我尝试查找示例,但没有成功。

是的,我可以解压所有 kwargs 并为每个参数执行一个循环,但看起来不太好,就像这样:

def get_channels(**kwargs):
    return [c for c in data["channels"] if c[kwargs.keys()] == kwargs.values()]
Run Code Online (Sandbox Code Playgroud)

编辑

只是为了澄清。我不认为有什么问题:

def get_channels(**kwargs) -> list:
        lst_groups = data["channels"]
        for key, value in kwargs.items():
            lst_groups = [c for c in lst_groups if c[key] == value]
        return lst_groups
Run Code Online (Sandbox Code Playgroud)

这只是好奇心...

shr*_*ilc 5

你可以这样做:

def get_channels(**kwargs):
    return [c for c in data["channels"] if all(c[k]==v for k,v in kwargs.items())]
Run Code Online (Sandbox Code Playgroud)

此行为与您的编辑代码相匹配,其中每个条件都必须得到满足。不同的要求可能会使用any().

不过我会很小心,因为当字段名称作为 kwargs 传递时很容易引入错误。它们必须与里面的内容完全匹配,data['channels']否则你会得到KeyError.

如果这不仅仅是一个内部方法,那么调用者现在需要知道数据结构中使用的确切键,并且将来您将很难在不破坏依赖代码的情况下更改内容。