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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 00:48:24