您如何将 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 "", line 1, in File "/usr /lib/python3.9/inspect.py",第 1006 行,在 getsourcelines 行中,lnum = findsource(object) 文件 "/usr/lib/python3.9/inspect.py",第 835 行,在 findsource 中引发 OSError('无法获取源代码') OSError: 无法获取源代码 抱歉回复延迟。 @Siderius 尝试从文件而不是解释器运行代码。【参考方案2】:

您可以使用 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 函数读取为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 lambda 函数分解为自己的函数? (Lambda 目前超过 125 个字符)

Lambda 异步调用

您可以在 lambda 函数中添加条件吗?

如何从 lambda 函数返回字符串?

在C中将字符串的第一个字符读取为整数

任何人都可以解释这个lambda函数吗? x代表什么? [重复]