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

Python如何为内置dict类添加方法实现链式安全取值?

实现链式safe_get的可行方案

Python 内置的dict是C实现的扩展类型,默认不支持动态添加类属性或方法,因此你尝试直接给dict.safe_get赋值的写法会抛出TypeError: can't set attributes of built-in/extension type 'dict',无法直接实现。

针对你无法修改event生成逻辑、不想做复杂类型转换的场景,有两个低侵入的可行方案:


方案1:轻量包装类(完全匹配你要的链式调用风格)

仅需对最外层的event对象做一次包装,后续safe_get返回的结果会自动保持包装状态,不需要修改原有dict的结构,新增代码量极小:

class SafeDictWrapper:
    def __init__(self, data):
        self._data = data

    def safe_get(self, key):
        # 只要当前数据不是dict或者为None,后续调用都直接返回None的包装对象
        if not isinstance(self._data, dict):
            return SafeDictWrapper(None)
        return SafeDictWrapper(self._data.get(key))

    # 调用结束后通过该方法获取最终值
    def get(self):
        return self._data

调用方式和你期望的几乎一致:

result = SafeDictWrapper(event).safe_get("request_context").safe_get("identity").safe_get("sourceIp").get()

方案2:深度路径查询(写法更简洁,无链式调用冗余)

如果可以调整调用风格,用functools.reduce实现的深度安全获取函数代码更短,调用时直接传入所有key的路径即可,不需要写多层链式调用:

from functools import reduce

def deep_safe_get(data: dict | None, *keys: str):
    return reduce(
        lambda current, key: current.get(key) if isinstance(current, dict) else None,
        keys,
        data
    )

调用方式非常简洁:

result = deep_safe_get(event, "request_context", "identity", "sourceIp")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:45:01