Pergunta

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)`
Foi útil?

Solução

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top