【问题标题】:How do you read a lambda function as a string?您如何将 lambda 函数读取为字符串?
【发布时间】:2015-09-08 03:16:10
【问题描述】:

我想在创建它之后读取我创建为字符串的 lambda 函数。

例如,

func = lambda num1,num2: num1 + num2

我想把func读作:

'lambda num1,num2: num1 + num2'

有没有办法完成这个甚至读取 lambda 函数的任何部分?

【问题讨论】:

    标签: python string function 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() 的函数的所有行,整数表示提供的函数开始的行号。

      【讨论】:

        猜你喜欢
        • 2019-03-09
        • 1970-01-01
        • 2013-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多