Диктонары и лямбды внутри класса? - PullRequest
3 голосов
/ 13 ноября 2008

Как я могу сделать что-то вроде этого:

class Foo():
 do_stuff = { 
            "A" : lambda x: self.do_A(x),
            "B" : lambda x: self.do_B(x)
        }
def __init__(self):
    print "hi"

def run(self):
    muh = ['A', 'B', 'A']
    for each in muh:
        self.do_stuff[each](each)

def do_A(self, moo):
    print "A"

def do_B(self, boo):
    print "B"

if(__name__ == '__main__'):
aFoo = Foo()
aFoo.run()

Это приводит к ошибке, что self не определяется в лямбда-функции, но если я ее уберу. Там написано, что do_A или do_B не определены.

EDIT

Мне удалось понять это. Мне нужно изменить лямбда-выражение на что-то вроде этого:

lambda x, y: x.do_A(y)

и я бы назвал это так:

self.do_stuff[each](self, each)

Это ужасная идея?

1 Ответ

7 голосов
/ 13 ноября 2008

do_stuff не является переменной экземпляра в вашем примере. Это больше похоже на статическую переменную. Вам необходимо определить do_stuff в методе (например, метод init ), где у вас есть ссылка на себя, чтобы сделать его переменной экземпляра. Надеюсь, этот пример прояснит для вас:

class Foo:

  def __init__(self):
    self.do_stuff = { "A": self.do_A, "B": self.do_B }

  def run(self):
    for x in ["A", "B"]:
      self.do_stuff[x]("hi")

  def do_A(self, x):
    pass

  def do_B(self, x):
    pass

Обратите внимание, что лямбда-функции не нужны. Вы можете просто хранить ссылки на сами функции в своем словаре. Запись «self.do_A» автоматически передаст self в качестве первого аргумента.

РЕДАКТИРОВАТЬ: Кто-нибудь знает, как правильно показать подчеркивания в тексте, не являющемся примером кода?
РЕДАКТИРОВАТЬ: WTH? Предварительный просмотр показывает подчеркивание иначе, чем сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...