如何在Python中获取Lambda函数的确切代码?

3

我想知道是否有一种方法可以获取以下Lambda函数的代码:

a = {"test": lambda x: x + 123, "test2": lambda x: x + 89}

有没有一种方法可以...
print(getsource(a["test"])

That returns :

lambda x: x + 123

我已经知道 inspect 和 dill 的 getsource 函数,但以下代码:

import inspect
import dill

if __name__ == "__main__":

    a = {"test": lambda x: x + 123, "test2": lambda x: x + 89}

    print(inspect.getsource(a["test"]))
    print(dill.source.getsource(a["test"]))

返回:

a = {"test": lambda x: x + 123, "test2": lambda x: x + 89}

a = {"test": lambda x: x + 123, "test2": lambda x: x + 89}

a["test"] 不是会给你 lambda 函数的代码吗? - Julian Chan
你好,感谢您的回复。不幸的是,我只得到了:<function <lambda> at 0x000000000204C1E0>。 - mrnl
是的,我想将lambda函数定义作为字符串打印出来。 - mrnl
这个能解决你的问题吗?https://dev59.com/NV0Z5IYBdhLWcg3w3Dbk#30984012 - Julian Chan
可能的解决方案是为每行代码创建一个lambda函数。另一个选项是使用ast模块和适当的解析器,如astunparse项目来分析和修改源代码。例如,请参见https://dev59.com/lnRA5IYBdhLWcg3w9ivq - user10325516
显示剩余2条评论
2个回答

1
以下是关于函数 mygetsource 的介绍,是否满足您的需求?

import inspect

def mygetsource(l, n):
    s = inspect.getsource(l[n])
    s = s[s.index('{')+1:-2]
    d = {x[1:x.index(':')-1]: x[x.index(':')+2:] for x in s.split(', ')}
    return d[n]

a = {"test": lambda x: x + 123, "test2": lambda x: x + 89}
print(mygetsource(a, "test"))
print(mygetsource(a, "test2"))
b = {'func1': lambda y: y * 10, 'func2': lambda z: z ** z}
print(mygetsource(b, "func1"))
print(mygetsource(b, 'func2'))

以下是结果:
lambda x: x + 123
lambda x: x + 89
lambda y: y * 10
lambda z: z ** z

1

我遇到了相同的问题,所以我写了一些代码,我相信这些代码至少可以部分地解决这个问题。

def get_lambda_source(lambda_func, position):
    import inspect
    import ast
    import astunparse
    code_string = inspect.getsource(lambda_func).lstrip()
    class LambdaGetter(ast.NodeTransformer):
        def __init__(self):
            super().__init__()
            self.lambda_sources = []

        def visit_Lambda(self, node):
            self.lambda_sources.append(astunparse.unparse(node).strip()[1:-1])

        def get(self, code_string):
            tree = ast.parse(code_string)
            self.visit(tree)
            return self.lambda_sources
    return LambdaGetter().get(code_string)[position]

在您的情况下,
print(get_lambda_source(a['test'], 0]))

返回

lambda x: x + 123

注意这个在shell中不起作用。


太棒了。这是防错的,这很好。但这也需要第三方的“astunparse”包,而且速度非常慢,这不是很好。 第三方的“icontract”包中有一个类似的解决方案,但是用“asttokens”代替了“astunparse”。当然,两种方法都有优缺点。 </叹气> - Cecil Curry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接