Есть ли эквивалент в Linq.Expressions.Expression в python?

1

Я хотел бы получить выражение из лямбда-функции, как это делает С#, и проанализировать его на что-то еще?
Пример в С#:

void Foo<T>(Expression<Func<T, bool>> expression
{
// ...
}

Foo<Baz>(someObj => someObj.HasBar);

Лямбда-оператор будет преобразован в выражение, которое можно проверить.
Что такое эквива лент в python?

  • 0
    Из любопытства: зачем тебе это? Как бы я ни любил возиться с вещами, связанными с компилятором, включая AST, я не знал, что это полезно вне какого-то экстремального метапрограммирования.
  • 0
    @delnan: потому что лямбда-выражение может быть переведено в оператор SQL. Мне интересно, можно ли улучшить API запросов в django ORM.
Показать ещё 5 комментариев
Теги:
lambda
expression-trees

1 ответ

1

Python предоставляет полный доступ к скомпилированной форме кода.

>>> f = lambda(x): 2*x
>>> f.func_code.co_code
'd\x00\x00|\x00\x00\x14S'
>>> 

Вы можете, в принципе, перепроектировать это, чтобы выяснить выражение, хотя это не значит, что это так. Модуль dis может дать вам немного начало:

>>> import dis
>>> dis.dis(f)
  1           0 LOAD_CONST               0 (2)
              3 LOAD_FAST                0 (x)
              6 BINARY_MULTIPLY     
              7 RETURN_VALUE        
>>> dis.opname[ord(f.func_code.co_code[-2])]
'BINARY_MULTIPLY'
>>> dis.opname[ord(f.func_code.co_code[-1])]
'RETURN_VALUE'
>>> 
  • 1
    Это все равно что ответить на вопрос для C AST с помощью gcc -S ...
  • 0
    Нет ли лучшего способа сделать это?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню