Уведомления

Группа в Telegram: @pythonsu

#1 Март 17, 2012 16:32:02

python-er
От:
Зарегистрирован: 2012-02-19
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Сгенерировать lambda-функцию

Имеется словарь, необходимо сгенерировать на его основе некоторую lambda-функцию, например вида:

{'a.x': 3, 'b.x': 4, 'b.y': 5, }

lambda a, b: (a.x, b.x, b.y)
Похоже, что это должен делать types.CodeType, но не нахожу достойного описния КАК.



Офлайн

#2 Март 17, 2012 17:01:18

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Сгенерировать lambda-функцию

AST -> compile -> code object -> function object



Офлайн

#3 Март 17, 2012 17:12:39

python-er
От:
Зарегистрирован: 2012-02-19
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Сгенерировать lambda-функцию

Да. Но в types.CodeType получаю

lambda a, b: (a.x, a.x, a.y)
И не могу найти описания того, как заставить types.CodeType соединять атрибуты с вторым аргументом.



Офлайн

#4 Март 17, 2012 17:28:09

python-er
От:
Зарегистрирован: 2012-02-19
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Сгенерировать lambda-функцию

вот сам код и результат:

co = CodeType(1, 1, 2, 67, ''.join(map(chr, co)),
(None, 3, 4, 5), ('', 'x', 'x', 'y'), ('a', 'b'), '', '<lambda>', 1, '')

есть так: "lambda a, b: (a.x == 3) and ((a.x == 4) and (a.y == 5))"
надо так: "lambda a, b: (a.x == 3) and ((b.x == 4) and (b.y == 5))"



Офлайн

#5 Март 18, 2012 08:13:39

python-er
От:
Зарегистрирован: 2012-02-19
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Сгенерировать lambda-функцию

Нашел.

За соединение аргументов отвечает второй байт (переменная idx) в каждой группе “co”:

      co += [124, idx, 0,
105, i, 0,
100, i, 0,
106, 2, 0,



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version