【问题标题】:How can I get exactly the code of a lambda function in python?如何在 python 中准确获取 lambda 函数的代码?
【发布时间】:2019-12-27 09:35:47
【问题描述】:

我想知道是否有办法获取以下 lambda 函数的代码:

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

有没有办法点赞

print(getsource(a["test"])

返回:

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 函数的代码吗?
  • 嗨,谢谢你的回复,很遗憾没有,我只得到: at 0x000000000204C1E0>
  • 您到底在寻找什么? lambda x: x +123 作为字符串?
  • 是的,我想将 lambda 函数定义打印为字符串。
  • 这能解决您的问题吗? stackoverflow.com/a/30984012/8268531

标签: python function lambda


【解决方案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 中不起作用。

【讨论】:

【解决方案2】:

下面的函数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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-30
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    相关资源
    最近更新 更多