Есть ли эквивалент в Linq.Expressions.Expression в python? - PullRequest
1 голос
/ 26 апреля 2011

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

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

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

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

1 Ответ

1 голос
/ 26 апреля 2011

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'
>>> 
...