4

私はかなり典型的なクラスを持っているプログラムを書きました。このクラスでは、複数のnamedtupleオブジェクトを作成します。名前付きタプルオブジェクトは多くのアイテムを保持しますが、バインドしようとするラムダ関数を除いて、すべて正常に機能します。以下は、簡略化された例と私が受け取っているエラーメッセージです。なぜこれがうまくいかないのか誰かが知っていることを願っています。前もって感謝します!

ファイル: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)

ファイル: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)

エラー:

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)`
4

1 に答える 1

4

namedtuple()コンストラクターは、インスタンス自体ではなく、クラスを返します。そのクラスにメソッドを追加しています。selfそのため、ラムダは引数を受け入れる必要があります。

いずれの場合も、作成した名前付きタプルクラスのインスタンスを作成する必要があります。ラムダに最初の引数を与えたくない場合は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)
于 2012-12-07T16:01:05.057 に答える