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

如何区分Python __getitem__中obj[x, y]与obj[(x, y)]的调用场景?

解决方案

Python 语法层面确实会将方括号内的逗号分隔参数自动打包为元组,没有原生机制区分obj[a,b]隐式生成的元组和obj[(a,b)]显式传入的元组,但可以通过以下两种比现有方案更友好的方式实现需求:

方案1:静态配置外层索引类型

通过类属性明确声明外层结构是否支持元组作为合法索引,逻辑简单稳定,适合业务场景明确的情况。

class NestedStore:
    # 配置项:外层是否允许元组作为索引
    _outer_allow_tuple_keys = False

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

    def __getitem__(self, key):
        # 仅当传入元组且外层不允许元组索引时,执行嵌套拆解
        if isinstance(key, tuple) and not self._outer_allow_tuple_keys:
            res = self._data[key[0]]
            for k in key[1:]:
                res = res[k]
            return res
        # 其余情况直接按单索引取值
        return self._data[key]

用法示例

  • 外层无元组索引场景:
data = {"user": {"name": "张三", "age": 20}, "id": 1001}
store = NestedStore(data)
print(store["user", "name"]) # 输出 张三,等价于 store["user"]["name"]
print(store["id"]) # 输出 1001,无需额外加逗号
  • 外层支持元组索引场景,直接继承修改配置即可:
class TupleKeyStore(NestedStore):
    _outer_allow_tuple_keys = True

data = {("user", "name"): "张三", "user": {"age": 20}}
store = TupleKeyStore(data)
print(store[("user", "name")]) # 输出 张三,直接取外层元组索引对应的值

方案2:动态智能匹配

优先匹配外层元组索引,匹配不到时自动走嵌套拆解,无需提前配置,适合灵活度要求高的场景。

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

    def __getitem__(self, key):
        if not isinstance(key, tuple):
            return self._data[key]
        # 优先尝试直接匹配外层元组索引
        if key in self._data:
            return self._data[key]
        # 匹配失败走嵌套拆解
        res = self._data[key[0]]
        for k in key[1:]:
            res = res[k]
        return res

极端冲突场景处理

如果出现外层元组索引和嵌套路径完全重名的情况,可以加一个哨兵对象强制指定走嵌套逻辑:

# 哨兵对象,仅做标记用,无需实现任何逻辑
Nested = object()

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

    def __getitem__(self, key):
        if not isinstance(key, tuple):
            return self._data[key]
        # 首元素为哨兵时,强制走嵌套拆解
        if len(key) > 0 and key[0] is Nested:
            res = self._data[key[1]]
            for k in key[2:]:
                res = res[k]
            return res
        if key in self._data:
            return self._data[key]
        res = self._data[key[0]]
        for k in key[1:]:
            res = res[k]
        return res

# 重名场景用法示例
data = {
    ("user", "name"): "外层元组索引值",
    "user": {"name": "嵌套取值结果"}
}
store = SmartNestedStore(data)
print(store[("user", "name")]) # 输出 外层元组索引值
print(store[Nested, "user", "name"]) # 强制输出 嵌套取值结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:54:00