在match-case结构中测试对象的可调用性

4 投票
1 回答
61 浏览
提问于 2025-04-14 17:37

为了让大家更明白,我有一个函数,它的作用是把字典里的键进行匹配,从而执行某些操作。这个函数可以接收一系列要匹配的键,或者一个能够识别这些键的函数。

我在想,能不能用 match-case 这种模式来实现这个功能。我尝试了以下的代码:

def process_fields(dataset,function,fields):
    """Apply function to selected values of a dictionary
    fields can be a list of keys whose values shall be processed, 
    or a predicate that returns True for the targeted fields."""
    
    match fields:
        case list() | set() | tuple():
            key_matcher = lambda x:x in fields
        case <what I'm looking for>:
            key_matcher=fields
    walk_items(dataset,key_matcher,function)

到目前为止,我尝试过:

        case callable(function):
            key_matcher=function
        case typing.Callable(function):
            key_matcher=function

我在官方文档里找不到我需要的信息。我是不是漏掉了什么,还是说这个功能根本做不到?

这里有个例子,避免太过抽象。请注意,我并不是在寻找解决这个特定问题的替代方案,我自己完全可以做到;我只是想知道是否存在一种方法,可以在这个特定情况下使用 Python 的这种结构。

编辑:虽然这个函数本身不是帖子关注的重点,但我添加了文档字符串,并稍微简化了一下,以便更清楚地说明这个例子。

1 个回答

1

我可能误解了你想要做的事情,但也许这能帮到你(如果没有帮助,我会删掉这段)。

如果你想检查一个对象是否可以被调用,也就是看看它是不是一个可以像函数一样使用的东西,那么可以这样做:

from collections.abc import Callable

def func():
    pass

f = func

match f:
    case Callable():
        print("Yes it's callable")

撰写回答