如何获得函数/lambda的准确表示?
问题出现的原因是用户想要获取一个函数或lambda表达式的准确表示。用户想要查看函数或lambda表达式的源代码以及文档字符串。
解决方法是在IPython或类似使用IPython的项目中使用foo??
或??foo
来查看完整的源代码。如果只想查看函数的文档字符串,则可以使用foo?
或?foo
。这些方法在Jupyter notebook中也适用。
下面是一个示例,展示了如何使用foo??
来获取函数的源代码:
In [19]: foo?? Signature: foo(arg1, arg2) Source: def foo(arg1,arg2): #do something with args a = arg1 + arg2 return a File: ~/Desktop/<ipython-input-18-3174e3126506> Type: function
这对于在IPython和Jupyter notebook中意外删除包含已创建和测试了一整天的函数的多个单元格的情况非常有帮助。
如果整个类被删除,用户可以逐个方法地恢复。首先使用dir(MyClass)
来列出类的所有方法,然后使用MyClass.__init__??
等来查看每个方法的源代码。
需要注意的是,这些方法仅适用于IPython和依赖于IPython的项目,如Jupyter。它们不能解决问题的普遍情况。
如何获取函数/lambda的准确表示?
要获取函数源代码的准确表示,可以使用inspect模块中的getsource函数。如果函数是从可用于文件系统的源文件中获取的,可以使用inspect.getsource(foo)来获取源代码。但是如果函数是从字符串、流或编译文件导入的,则无法检索到其源代码。
getsource函数返回一个元组,其中元组的第一个元素是表示源代码行的字符串列表,第二个元素是在执行上下文中运行的行号。在IPython中,这是单元格内的行号,而不是整个笔记本的行号。
如果需要查看REPL中的源代码,使用getsource函数更有用。但是对于内置函数如len等,getsource函数不起作用。可以在cpython的官方网站或GitHub上查找这些内置函数的源代码。
此外,还可以使用.split('\n')对获取的源代码进行分割处理。如果要打印与类关联的特定方法,可以使用相应的类和方法名称进行查找。
总结起来,要获取函数/lambda的准确表示,可以使用inspect模块中的getsource函数。然而,对于从字符串、流或编译文件导入的函数,无法获取其源代码。此外,对于内置函数和通过装饰器转换后的函数,getsource函数也无法提供准确的源代码表示。
如何获取函数/lambda函数的准确表示?
问题的出现原因:
- inspect模块在检索python对象的源代码时,似乎只能在源代码位于文件中时才能工作。如果有源代码文件,那么我猜你就不需要从对象中获取源代码了。
解决方法:
- 可以使用inspect模块的getsource方法来获取普通函数的源代码,例如:import inspect def foo(arg1,arg2): #do something with args a = arg1 + arg2 return a source_foo = inspect.getsource(foo) # foo is normal function print(source_foo)
- 但是对于内置函数,会出现错误。例如:inspect.getsource(max)会导致TypeError:
- 不过,在Ipython/Jupyter笔记本中,inspect模块也能正常工作。
- 另外,可以使用expandtabs方法来修复源代码的缩进,默认缩进是8个空格,可以使用inspect.getsource(foo).expandtabs(4)来修复缩进为4个空格。
- inspect模块提供了一种在Python中获取函数/lambda函数源代码的方法,但是只能用于在文件中定义的对象。对于内置函数等其他类型的对象,无法使用inspect模块来获取源代码。