将 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 个参数(self
和 x
)的 lambda。该错误清楚地告诉您,当您调用 lambda 函数时,您只是传递了一个绑定到 self
的参数,因此您缺少 x
。
【讨论】:
以上是关于将 lambda 函数添加到类的符号表中的主要内容,如果未能解决你的问题,请参考以下文章
通过 Cloudformation 模板将 Lambda 函数添加到 Kinesis Firehose