Python:Lambda函数作为namedtuple对象吗?

问题描述:

我写了一个程序,其中我有一个相当典型的类。在这个类中,我创建了多个namedtuple对象。 namedtuple对象包含许多项目,除了我试图绑定的lambda函数外,其他项目都可以正常工作。下面是一个精简的例子和我收到的错误信息。希望有人知道为什么这会出错。提前致谢!Python:Lambda函数作为namedtuple对象吗?

FILE:test.py

from equations import * 
from collections import namedtuple 

class Test: 
    def __init__(self, nr): 
     self.obj = self.create(nr) 
     print self.obj.name 
     print self.obj.f1(2) 

    def create(self, nr): 
     obj = namedtuple("struct", "name f1 f2") 
     obj.name = str(nr) 
     (obj.f1, obj.f2) = get_func(nr) 
     return obj 

test = Test(1) 

FILE:equations.py

def get_func(nr): 
    return (lambda x: test1(x), lambda x: test2(x)) 

def test1(x): 
    return (x/1) 

def test2(x): 
    return (x/2) 

ERROR:

Traceback (most recent call last): 
File "test.py", line 17, in <module> 
    test = Test(1) 
    File "test.py", line 8, in __init__ 
    print self.obj.f1(2) 
TypeError: unbound method <lambda>() must be called with struct instance as first argument (got int instance instead)` 
+0

您是否知道您的'get_func'有一个未使用'nr'说法? – jdotjdot

+0

@Martijn - 是的,只是意识到'x'是'lambda'参数,所以我编辑了我的评论。 – jdotjdot

namedtuple()构造函数返回,而不是实例本身。您正在为该类添加方法。因此,您的lambda必须接受self参数。

无论如何,您应该创建您创建的指定元组类的实例。如果你不想让你的lambda表达式一个self第一个参数,将其添加到,那么你将创建精细的做工实例:

from equations import * 
from collections import namedtuple 


Struct = namedtuple("struct", "name f1 f2") 


class Test: 
    def __init__(self, nr): 
     self.obj = self.create(nr) 
     print self.obj.name 
     print self.obj.f1(2) 

    def create(self, nr): 
     obj = Struct(str(nr), *get_func(nr)) 
     return obj 

test = Test(1) 
+0

不能跟你争论那个! +1 –

+0

哈,但你*可以*纠正我有缺陷的语法! :-P –

+0

@JonClements:然而,我也搞错了...... –