python-打印定义lambda函数的代码
这个问题已经在这里有了答案:
如何获得Python函数的源代码? 13个答案
我希望能够打印lambda函数的定义代码。
如果我通过lambda语法定义此函数的示例:
>>>myfunction = lambda x: x==2
>>>print_code(myfunction)
我想要这个输出:
x==2
Mapad asked 2020-07-14T02:47:55Z
6个解决方案
62 votes
只要将代码保存到源文件中,您就可以检索以下代码的源代码使用检查模块的对象。
例:打开编辑器类型:
myfunction = lambda x: x==2
另存为lamtest.py
打开shell类型的python进入交互式python输入以下内容:
>>>from lamtest import myfunc
>>>import inspect
>>>inspect.getsource(myfunc)
结果:
'myfunc = lambda x: x==2\n'
pcn answered 2020-07-14T02:48:29Z
21 votes
它仅适用于基于数学的运算,但是您可以查看SymPy的Lambda()对象。 正是为此目的而设计的:
>>> from sympy import *
>>> x = Symbol('x')
>>> l = Lambda(x, x**2)
>>> l
Lambda(_x, _x**2)
>>> l(3)
9
它甚至支持漂亮的打印:
>>> pprint(l)
⎛ 2⎞
Λ⎝x, x ⎠
为了做您的平等示例,我们使用SymPy Eq()对象:
>>> l1 = Lambda(x, Eq(x, 2))
>>> l1
Lambda(_x, _x == 2)
>>> l1(2)
True
它支持部分参数扩展:
>>> y = Symbol('y')
>>> l2 = Lambda((x, y), x*y + x)
>>> l2(1)
Lambda(_y, 1 + _y)
>>> l2(1, 2)
3
当然,您可以获得SymPy的所有计算机代数的优势:
>>> l3 = Lambda(x, sin(x*pi/3))
>>> pprint(l3(1))
⎽⎽⎽
╲╱ 3
─────
2
顺便说一句,如果这听起来像是一个无耻的插头,那是因为。 我是SymPy的开发人员之一。
asmeurer answered 2020-07-14T02:49:11Z
14 votes
虽然我通常会同意dill是一个很好的答案,但我不同意您无法获得解释器中定义的对象的源代码。 如果使用dill中的dill.source.getsource,则即使函数和lambda是交互定义的,也可以获取它们的源代码。它也可以从在curry中定义的绑定或未绑定类方法和函数中获取代码。但是,如果没有封闭对象的代码,您可能无法编译该代码。
>>> from dill.source import getsource
>>>
>>> def add(x,y):
... return x+y
...
>>> squared = lambda x:x**2
>>>
>>> print getsource(add)
def add(x,y):
return x+y
>>> print getsource(squared)
squared = lambda x:x**2
>>>
>>> class Foo(object):
... def bar(self, x):
... return x*x+x
...
>>> f = Foo()
>>>
>>> print getsource(f.bar)
def bar(self, x):
return x*x+x
>>>
Mike McKerns answered 2020-07-14T02:49:33Z
6 votes
这将非常困难,因为您的lambda函数将被编译为字节码,而myfunction对象将仅指向字节码,而不是您编写的人类可读代码。
例如,如果定义2个函数,则一个使用lambda语法,一个使用def语句,如下所示:
>>> lambda_func = lambda x: x==2
>>> def def_func(x): return x == 2
...
就python而言,这两个对象(lambda_func和def_func)是等效的。 实际上,如果继续使用dis模块对其进行拆装(如rebra所建议),您将获得相同的结果:
>>> import dis
>>> dis.dis(lambda_func)
1 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (2)
6 COMPARE_OP 2 (==)
9 RETURN_VALUE
>>> dis.dis(def_func)
1 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (2)
6 COMPARE_OP 2 (==)
9 RETURN_VALUE
在这种情况下,您可以看到在多对一关系中获取原始代码会有多么困难
Moe answered 2020-07-14T02:50:07Z
2 votes
这个怎么样?
class MyLambda( object ):
def __init__( self, body ):
self.body= body
def __call__( self, arg ):
x = arg
return eval( self.body )
def __str__( self ):
return self.body
f= MyLambda( "x == 2" )
print f(1)
print f(2)
print f
S.Lott answered 2020-07-14T02:50:27Z
-4 votes
为什么要这样做?
我猜您可以使用“ dis”模块将代码反汇编为python字节码,但这可能不是您想要的。
[HTTP://呜呜呜.Python.org/doc/2.5.2/礼拜/module-第三.HTML]
再次,我看不到用例。 也许eval()更适合您的问题。 它是内置的,然后您可以使用字符串在代码中传递代码。
rebra answered 2020-07-14T02:51:02Z