如何在方法内获取未以字符串传入的namedtuple属性名称?
获取NamedTuple属性名的实现方案
针对你提出的需求——在attempt_access方法内获取传入属性对应的名称,可通过以下方式实现:
修改后的完整代码
from typing import NamedTuple class Record(NamedTuple): id: int name: str age: int class NamedTupleList: def __init__(self, data): self._data = data # 预存字段名列表(假设所有数据为同一种NamedTuple类型) self._field_names = data[0]._fields if data else () def attempt_access(self, row, column): r = self._data[row] column_name = None try: # 处理索引访问的情况 val = r[column] if isinstance(column, int): # 通过索引映射到字段名 column_name = self._field_names[column] except TypeError: # 处理字段对象访问的情况 val = column.__get__(r) # 直接从字段对象获取名称 column_name = column.name # 示例:使用字段名生成提示信息 if column_name: print(f"当前访问的字段为: {column_name}") # 其他需要字段名的功能可在此处扩展 return val data = [Record(1, 'Bob', 30), Record(2, 'Carol', 25), ] class_data = NamedTupleList(data) print(class_data.attempt_access(0, 2)) # 输出字段名age,然后30 print(class_data.attempt_access(0, Record.age)) # 输出字段名age,然后30
关键实现逻辑
索引转字段名:
NamedTuple实例自带_fields元组,按类定义顺序存储所有字段名。当传入的column是整数索引时,直接通过索引从_field_names中取出对应名称。字段对象直接取名称:
Record.age这类NamedTuple的类属性本质是字段对象,自带name属性,直接访问即可拿到对应的字段名(如'age')。
边界情况提示
- 如果初始化时传入空数据,需额外处理
_field_names为空的场景,避免后续索引访问报错。 - 若传入的索引超出字段范围,可在代码中添加
IndexError捕获,结合字段名(或索引值)生成更友好的错误信息。
内容的提问来源于stack exchange,提问作者MikeP
相关产品推荐
相关产品推荐

