Python: Lambda function as a namedtuple object?

lambda, namedtuple, python

Solution

The `namedtuple()` constructor returns a class, not an instance itself. You are adding methods to that class. As such, your lambda's must accept a `self` argument.

In any case, you should create instances of the named tuple class you created. If you don't want to give your lambdas a `self` first argument, adding them to the instance you then created would work fine:

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)

Problem

I've written a program in which I have a fairly typical class. In this class I create multiple namedtuple objects. The namedtuple objects hold many items, which all work fine, except for lambda functions that I try to bind to it. Below is a stripped down example and the error message that I am receiving. Hope someone knows why this is going wrong. Thanks in advance! 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)` ```

Original source