将 lambda 函数添​​加到类的符号表中

Posted

技术标签:

【中文标题】将 lambda 函数添​​加到类的符号表中【英文标题】:Adding lambda functions to a symbol table of a class [duplicate] 【发布时间】:2017-11-28 02:10:32 【问题描述】:

我正在尝试:

class B:
    def __init__(self):
        func = lambda self, x: x*x  # <-- Adding 'self' produces error
        self.__dict__['test1'] = func
        print(self.test1(2))
        print(self.test2(2))

    def test2(self, b):
        return b*b*b

b = B()

但这会产生错误(使用python t.py 运行脚本):

Traceback (most recent call last):
  File "./t.py", line 14, in <module>
    b = B()
  File "./t.py", line 8, in __init__
    print(self.test1(2))
TypeError: <lambda>() missing 1 required positional argument: 'x'

但是,如果我删除 self 作为 Lambda 函数的参数,它就可以正常工作。

为什么这里不需要 self 作为 Lambda 函数的参数?

【问题讨论】:

你可以使用self.test1 = types.MethodType(func, self),否则它就像一个静态方法,没有Python应用self引用类实例所必需的魔法。 @Delgan 谢谢,应该可以! 【参考方案1】:

类方法的调用:

instance.method(arg1, arg2, ..., argn)

内部绑定到:

instance_class.method(instance, arg1, ..., argn)

instance 显然是self

您将 lambda 存储为实例属性,不会将其视为实例方法。这就是为什么self 不会作为第一个参数自动传递的原因。

【讨论】:

感谢您的回答。这是有道理的。那么将 lambda 函数添​​加为实例属性不会使其成为实例方法吗?但是如何将 lambda 视为实例方法呢? this question 的回答很好地说明了这一点。试试self.__dict__['test1'] = types.MethodType( func, self ) 感谢@IlarioPierbattista。我想我找到了解决方案:根据您提到的答案,我应该可以使用以下方法使其成为实例方法:self.__dict__['test1'] = types.MethodType( func, self )【参考方案2】:

lambda 函数是匿名函数,它们不绑定到类,所以在这种情况下,您将创建一个带有 2 个参数(selfx)的 lambda。该错误清楚地告诉您,当您调用 lambda 函数时,您只是传递了一个绑定到 self 的参数,因此您缺少 x

【讨论】:

以上是关于将 lambda 函数添​​加到类的符号表中的主要内容,如果未能解决你的问题,请参考以下文章

通过 Cloudformation 模板将 Lambda 函数添​​加到 Kinesis Firehose

在编译时从符号表中获取函数名

如何获取当前范围/符号表中定义的所有变量?

将json-simple添加到类路径后仍然无法解析简单符号[重复]

extract — 从数组中将变量导入到当前的符号表

extract — 从数组中将变量导入到当前的符号表