如何获取Python中Lambda/函数的准确字符串表示?
获取Lambda函数的字符串表示
太懂这种无奈了!默认打印lambda函数只会出来一串内存地址,完全看不到实际写的逻辑,跟你说的JS里的function foo(){ <native code> }一样没用。不过Python里有办法拿到lambda的源代码表示,刚好能满足你的需求!
最直接的解决方案:用inspect模块
Python标准库的inspect模块专门用来获取对象的源代码信息,用它的getsource方法就能轻松拿到lambda的定义:
import inspect quux = lambda x: 1 - abs(x) print(inspect.getsource(quux))
运行这段代码后,就能输出lambda x: 1 - abs(x),完全是你想要的实际逻辑内容!
小注意点:交互式环境的坑
如果你是在Python交互式命令行(比如直接在终端敲python进入的环境)里定义的lambda,inspect.getsource可能会抛出OSError,因为交互式环境里的代码没有对应的本地源文件。这种情况下,要么把lambda写在.py脚本文件里运行,要么可以用下面的包装类方法。
自定义打印行为:包装Lambda
如果想让lambda每次被打印时都自动显示源代码,可以把它包装在一个自定义类里,重写__repr__方法:
import inspect class ReprLambda: def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): # 保持原lambda的调用能力 return self.func(*args, **kwargs) def __repr__(self): # 返回lambda的源代码 return inspect.getsource(self.func).strip() # 用包装类创建lambda quux = ReprLambda(lambda x: 1 - abs(x)) print(quux) # 直接输出 lambda x: 1 - abs(x) print(quux(-5)) # 正常调用,输出 -4
这样既保留了lambda的所有功能,又能在打印时直接看到逻辑。
备选方案:反编译字节码(应急用)
如果实在拿不到源代码,还可以用dis模块反编译lambda的字节码,虽然不如源代码直观,但也能间接看出逻辑:
import dis quux = lambda x: 1 - abs(x) dis.dis(quux)
输出的字节码会展示函数的执行步骤,能帮你还原逻辑。
内容的提问来源于stack exchange,提问作者Ben Rivers
相关产品推荐
相关产品推荐

