Форум сайта python.su
2
Хочу запилить список функций. Если перебираю методы класса вручную - список list_func_ok, то все ок - вызываются методы разных объектов.
Если перебираю методы в цикле (список list_func_err) - вызывается метод одного объекта.
Подскажите кто виноват и что делать?)
def test(): class TestObj: def __init__(self , _id): self.id = _id def Show(self): print 'object has id %s'%self.id def GetId(self): return self.id test_dict = {'0':TestObj('0'), '1':TestObj('1'), '2':TestObj('2')} list_func_ok = [lambda:test_dict['0'].Show(), lambda:test_dict['1'].Show(), lambda:test_dict['2'].Show()] list_func_err = [lambda:test_dict[key].Show() for key in test_dict] for func in list_func_ok: func() print ' ' for func in list_func_err: func() test()
Офлайн
4
А зачем тебе объявление класса в теле функции раз, два, лямбда здесь не нужна, ну и третье, ты не передаешь в лямбду ни одного аргумента.
Офлайн
43
Aris_P@
используй map, у тебя же лямбды связываются с указателем, указатель на каждой итерации меняется
Офлайн
2
fongostevраз - класс для примера, думаю не стоит выкладывать сюда весь проект
А зачем тебе объявление класса в теле функции раз, два, лямбда здесь не нужна, ну и третье, ты не передаешь в лямбду ни одного аргумента.
Офлайн
2
sergeekспасибо, похоже это то, что надо :)
Aris_P@используй map, у тебя же лямбды связываются с указателем, указатель на каждой итерации меняется
Офлайн
4
Aris_P@Просто через вызов функции или, как было указано выше, через map, что по сути одно и то же:
два - расскажите как сделать список функций не через лямбду?
[f(x) for x in list] map(f, list)
Офлайн
857
так
list_func_err = [test_dict[key].Show for key in sorted(test_dict)]
list_func_err = [lambda key=key: test_dict[key].Show() for key in sorted(test_dict)]
fongostevтам есть разница, для map понадобится двойная lambda
как было указано выше, через map, что по сути одно и то же
list_func_err = map(lambda i: lambda: test_dict[i].Show(), sorted(test_dict))
Отредактировано py.user.next (Апрель 21, 2014 22:16:32)
Офлайн
2
fongostevвы наверно не поняли что мне нужно - мне надо не вызвать функции здесь и сейчас, надо сформировать из них список
Просто через вызов функции или, как было указано выше, через map, что по сути одно и то же:
list_func_err = map(lambda x:x.Show, test_dict.values())
py.user.nextтоже вариант решения, а sorted вы для копирования делали?
так
Офлайн
857
Aris_P@
а sorted вы для копирования делали?
>>> d = {'0': 1, '1': 2} >>> d {'1': 2, '0': 1} >>>
Aris_P@так оно тоже в произвольном порядкеlist_func_err = map(lambda x:x.Show, test_dict.values())
Офлайн
2
py.user.nextа порядок мне неважен, мне надо сформировать список функций, которые будут потом вызываться
Офлайн