【发布时间】:2019-03-11 17:19:23
【问题描述】:
我一直在使用 Python 标准库中的 inspect 模块。
以下示例可以正常工作(假设 inspect 已导入):
def foo(x, y):
return x - y
print(inspect.getsource(foo))
... 将打印 def foo(x, y):\n return x - y\n 和 ...
bar = lambda x, y: x / y
print(inspect.getsource(bar))
... 将打印bar = lambda x, y: x / y\n。到现在为止还挺好。然而,在以下示例中,事情变得有些奇怪:
print(inspect.getsource(lambda x, y: x / y))
... 将打印 print(inspect.getsource(lambda x, y: x / y)) 和 ...
baz = [2, 3, lambda x, y: x / y, 5]
print(inspect.getsource(baz[2]))
...将打印baz = [2, 3, lambda x, y: x / y, 5]。
模式似乎是所有相关的源代码行,无论上下文如何,都由getsource 返回。这些线上的所有其他内容,在我的情况下,除了所需的函数源/定义之外的东西,也包括在内。是否有另一种“替代”方法,可以提取代表函数源代码的内容 - 并且只提取其源代码 - 最好以某种匿名方式?
编辑(1)
def foo(x, y):
return x - y
bar = [1, 2, foo, 4]
print(inspect.getsource(bar[2]))
...将打印def foo(x, y):\n return x - y\n。
【问题讨论】:
-
@cglacet 感谢您的想法。我查看了dill 及其源代码并对其进行了测试。在我的问题的上下文中,它是对
inspect.getsource的略微改进的包装器,涵盖了一些边缘情况,例如在交互式环境中定义的函数。但它并没有解决我的根本问题——这里没有区别。 -
你“只”需要捕获 lambdas 吗?如果是,那么也许可以编写一个正则表达式来从代码行中提取 lambda。但我想这可能有点复杂。
-
@cglacet 我正在寻找适用于任何类型的函数定义/函数指针/函数引用的通用解决方案。似乎 lambdas 是更复杂的边缘情况......
def的函数定义更容易。例如,如果我在列表中引用了“真正的”Python 函数,类似于我上面的baz[2]示例,inspect确实会提供函数的源而不是列表的定义。 -
你上面的例子没有给出定义列表的行,而是出现第 2 项的行
标签: python python-3.x inspect