class OptChain:
    def __init__(self, value=None):
        self._value = value
    
    def __getattr__(self, name) -> "OptChain":
        # 当访问属性时
        if self._value is None:
            return OptChain(None)
        
        # 获取原始对象的属性
        attr = getattr(self._value, name, None)
                
        return OptChain(attr)
    
    def __call__(self, *args, **kwargs):
        # 如果值是 None，返回 None 包装
        if self._value is None:
            return OptChain(None)
        
        # 如果值是可调用的，安全调用它
        if callable(self._value):
            try:
                result = self._value(*args, **kwargs)
                return OptChain(result)
            except Exception:
                return OptChain(None)
        
        return OptChain(None)
    
    def __getitem__(self, key):
        # 安全访问字典或列表元素
        try:
            return OptChain(self._value[key]) if self._value is not None else OptChain(None)
        except (TypeError, KeyError, IndexError):
            return OptChain(None)
    
    def __setitem__(self, key, value) -> None:
        # 安全设置字典或列表元素
        if self._value is not None:
            self._value[key] = value
    
    @property
    def value(self):
        # 获取最终值（可加默认值）
        return self._value
    
    def get(self, default=None):
        # 带默认值的获取
        return self._value if self._value is not None else default
    
    def __repr__(self):
        return f"OptChain({self._value!r})"

# 使用示例：创建安全访问包装器
def optional(obj):
    return OptChain(obj)
    
