在Python Action实例中存储评估条件时遇TypeError问题求助
解决Python类中Lambda作为类属性引发的参数错误问题
问题原因
出现TypeError('<lambda>() takes 1 positional argument but 2 were given')的核心原因是:Python会自动将类属性中的lambda绑定为实例方法。当调用self._condition(item)时,Python会隐式把self作为第一个参数传入这个lambda,但你的lambda仅定义了一个参数,因此触发参数不匹配的错误。
解决方案
方案1:将类属性改为静态方法
把初始的_condition类属性定义为静态方法,避免被自动绑定为实例方法:
class Action: @staticmethod def _condition(i): return True def __init__(self, name): self.name = name def set_condition(self, cond): self._condition = cond def allowed_for_item(self, item): return self._condition(item)
类级别的_condition不会自动接收self参数,后续通过set_condition设置的lambda(如lambda item: item.editable)也能正常接收单个参数。
方案2:将初始_condition设为实例属性
在__init__方法中把_condition初始化为实例属性,而非类属性,这样不会触发Python的方法绑定逻辑:
class Action: def __init__(self, name): self.name = name self._condition = lambda i: True # 实例属性,非类属性 def set_condition(self, cond): self._condition = cond def allowed_for_item(self, item): return self._condition(item)
调用self._condition(item)时只会传入item一个参数,完全规避绑定问题。
更简洁的实现思路
直接在构造函数中支持传入条件参数,简化初始化流程:
class Action: def __init__(self, name, condition=lambda i: True): self.name = name self._condition = condition def allowed_for_item(self, item): return self._condition(item) # 使用示例 edit_action = Action("Edit Item", lambda item: item.editable)
无需额外调用set_condition,代码更紧凑,同时避免了类属性绑定的问题。
内容的提问来源于stack exchange,提问作者chrset
相关产品推荐
相关产品推荐

