修复TypeError错误:不修改my_list['push_first'](x)解决函数不可下标问题
修复方案:让
make_mutable_rlist支持下标式方法调用 错误本质是当前make_mutable_rlist返回的是普通函数,而函数不支持[]下标访问。要保留my_list['push_first'](x)的写法,需让返回对象实现__getitem__方法,通过该方法映射方法名到对应的操作逻辑。以下是两种可行修复方案:
方案1:基于类实现
用类封装递归列表的状态与方法,通过__getitem__映射方法名:
class MutableRList: def __init__(self): self.first = None self.rest = None def push_first(self, x): # 此处替换为你原有的push_first逻辑 old_first = self.first self.first = x if self.rest is None: self.rest = MutableRList() def __getitem__(self, method_name): if method_name == 'push_first': return self.push_first # 可添加其他方法的映射,如'pop_first'等 raise KeyError(f"Method '{method_name}' not found") def make_mutable_rlist(): return MutableRList()
方案2:闭包+自定义对象(无类实现)
通过闭包维护状态,给返回对象绑定__getitem__方法:
import types def make_mutable_rlist(): first = None rest = None def push_first(x): nonlocal first, rest # 此处替换为你原有的push_first逻辑 old_first = first first = x if rest is None: rest = make_mutable_rlist() # 创建命名空间对象并绑定方法 rlist_obj = types.SimpleNamespace() rlist_obj.push_first = push_first def __getitem__(key): if hasattr(rlist_obj, key): return getattr(rlist_obj, key) raise KeyError(f"Method '{key}' not found") rlist_obj.__getitem__ = __getitem__ return rlist_obj
两种方案的核心逻辑一致:当执行my_list['push_first']时,Python会调用对象的__getitem__方法,返回对应的操作函数,后续即可正常执行(x)调用。
内容的提问来源于stack exchange,提问作者Nadav Mozeson
相关产品推荐
相关产品推荐

