您如何将 lambda 函数读取为字符串?
Posted
技术标签:
【中文标题】您如何将 lambda 函数读取为字符串?【英文标题】:How do you read a lambda function as a string? 【发布时间】:2015-09-08 03:16:10 【问题描述】:我想在创建它之后读取我创建为字符串的 lambda 函数。
例如,
func = lambda num1,num2: num1 + num2
我想把func读作:
'lambda num1,num2: num1 + num2'
有没有办法完成这个甚至读取 lambda 函数的任何部分?
【问题讨论】:
【参考方案1】:编辑:因为我误解了问题,所以更改了我的第一个答案。这个答案是从许多其他用途中借来的,但是我已经完成了代码以仅显示您想要的字符串部分。
import inspect
func = lambda num1,num2: num1 + num2
funcString = str(inspect.getsourcelines(func)[0])
funcString = funcString.strip("['\\n']").split(" = ")[1]
print funcString
输出以下字符串:
lambda num1,num2: num1 + num2
【讨论】:
如果我复制并粘贴上面的代码,我会在第 3 行得到一个错误: Traceback (most recent call last): File "您可以使用 inspect
模块中的 getsourcelines
来执行此操作
此函数以列表形式返回任何函数、模块、类或方法的定义的所有行以及定义它的行号。
例如:
import inspect
f = lambda x, y : x + y
print inspect.getsourcelines(f)[0][0]
将函数的定义输出为:
f = lambda x, y: x + y
【讨论】:
【参考方案3】:可以使用 Python 的eval()
函数:
>>> func = eval('lambda num1,num2: num1 + num2')
>>> func
<function <lambda> at 0x7fe87b74b668>
计算任何表达式并返回值。
【讨论】:
eval 是邪恶的,被认为是不好的做法......建议不要这样做。【参考方案4】:您可以使用 Python 的 inspect
模块以字符串列表的形式获取所需的代码:
#!/usr/bin/env python3
# coding: utf-8
import inspect
func = lambda num1, num2: num1 + num2
def f():
a = 1
b = 2
return a + b
def get_code_as_string(passed_func):
return inspect.getsourcelines(passed_func)
if __name__ == '__main__':
# feed a lambda function
print(get_code_as_string(func))
#feed a normal function
print(get_code_as_string(f))
输出如下:
(['func = lambda num1, num2: num1 + num2\n'], 6)
(['def f():\n', ' a = 1\n', ' b = 2\n', ' return a + b\n'], 8)
如您所见,inspect.getsourcelines()
返回一个列表和一个整数的元组。该列表包含传递给inspect.getsourcelines()
的函数的所有行,整数表示提供的函数开始的行号。
【讨论】:
以上是关于您如何将 lambda 函数读取为字符串?的主要内容,如果未能解决你的问题,请参考以下文章