【发布时间】:2015-09-08 03:16:10
【问题描述】:
我想在创建它之后读取我创建为字符串的 lambda 函数。
例如,
func = lambda num1,num2: num1 + num2
我想把func读作:
'lambda num1,num2: num1 + num2'
有没有办法完成这个甚至读取 lambda 函数的任何部分?
【问题讨论】:
标签: python string function lambda
我想在创建它之后读取我创建为字符串的 lambda 函数。
例如,
func = lambda num1,num2: num1 + num2
我想把func读作:
'lambda num1,num2: num1 + num2'
有没有办法完成这个甚至读取 lambda 函数的任何部分?
【问题讨论】:
标签: python string function lambda
编辑:因为我误解了问题,所以更改了我的第一个答案。这个答案是从许多其他用途中借来的,但是我已经完成了代码以仅显示您想要的字符串部分。
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
【讨论】:
您可以使用 inspect 模块中的 getsourcelines 来执行此操作
此函数以列表形式返回任何函数、模块、类或方法的定义的所有行以及定义它的行号。
例如:
import inspect
f = lambda x, y : x + y
print inspect.getsourcelines(f)[0][0]
将函数的定义输出为:
f = lambda x, y: x + y
【讨论】:
可以使用 Python 的eval() 函数:
>>> func = eval('lambda num1,num2: num1 + num2')
>>> func
<function <lambda> at 0x7fe87b74b668>
计算任何表达式并返回值。
【讨论】:
您可以使用 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() 的函数的所有行,整数表示提供的函数开始的行号。
【讨论】: