You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否互换使用dict[key]与function(key)?如何实现统一取值语法

统一字典与函数的取值语法

要避免每次写三元表达式判断类型,你可以用下面几种方法实现统一的取值方式:

1. 用工具函数封装最省心

写一个通用的取值函数,内部帮你处理类型判断,调用时直接传对象和key就行:

def get_value(obj, key):
    return obj[key] if isinstance(obj, dict) else obj(key)

用的时候不管是字典还是函数,都这么调用:

# 字典场景
user_data = {"username": "ferk86"}
print(get_value(user_data, "username"))  # 输出 ferk86

# 函数场景
def get_profile(key):
    return f"profile_{key}"
print(get_value(get_profile, "email"))  # 输出 profile_email

2. 包装类实现方括号统一调用

如果想完全用方括号[]的语法,就写个简单的包装类,实现__getitem__方法:

class UnifiedGetter:
    def __init__(self, target):
        self.target = target
    
    def __getitem__(self, key):
        return self.target[key] if isinstance(self.target, dict) else self.target(key)

把你的字典或函数包一下,之后就可以像用字典一样取值:

# 包装字典
wrapped_dict = UnifiedGetter({"id": 2024})
print(wrapped_dict["id"])  # 输出 2024

# 包装函数
def fetch_data(key):
    return f"data_{key}"
wrapped_func = UnifiedGetter(fetch_data)
print(wrapped_func["score"])  # 输出 data_score

3. 动态适配(适合临时场景)

要是不想提前包装对象,也可以写个动态适配器,返回能直接用方括号的对象:

def adapt(obj):
    if isinstance(obj, dict):
        return obj
    class Adapter:
        def __getitem__(self, key):
            return obj(key)
    return Adapter()

用的时候先适配再取值:

# 适配字典
adapted_dict = adapt({"city": "Shanghai"})
print(adapted_dict["city"])  # 输出 Shanghai

# 适配函数
adapted_func = adapt(lambda k: f"result_{k}")
print(adapted_func["test"])  # 输出 result_test

内容的提问来源于stack exchange,提问作者ferk86

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:05:38