能否互换使用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
相关产品推荐
相关产品推荐

