python的lambda函数_python-打印定义lambda函数的代码

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值