如何获得Python中动态定义函数的源代码? - python

在Python中动态定义代码时(例如,通过exec或从import以外的其他媒体加载代码),我无法获取已定义函数的源代码。

inspect.getsource似乎从加载位置查找已加载的模块。

import inspect

code = """
def my_function():
  print("Hello dears")
"""
exec(code)
my_function() #Works, as expected
print(inspect.getsource(my_function)) ## Fails with OSError('could not get source code')

还有其他方法可以获取动态解释函数(或其他对象)的源代码吗?

python参考方案

还有其他方法可以获取动态解释函数(或其他对象)的源代码吗?

一种选择是将源转储到文件中并从那里执行,尽管这会浪费您清理文件系统的垃圾。

一种不太可靠但浪费较少的替代方法是,例如,使用astor.to_source()从字节码重建源(-ish)。它将为您提供“对应的”来源,但与原始来源相比,可能会更改格式或丢失元数据。

最简单的方法是将原始源代码简单地附加到创建的函数对象上:

code = """
def my_function():
  print("Hello dears")
"""
exec(code)
my_function.__source__ = code # has nothing to do with getsource

另一种选择(尽管在这里可能没有用,因为我假设您想例如从模板动态创建主体)是将代码对象替换为已更新的代码对象,该代码对象具有正确的/相关的firstlineno(尽管您可以选择文件名,可以将其设置为compile语句的一部分)。仅当出于某些奇怪的原因将python代码直接嵌入另一个文件中,但又不想或不想将其提取到自己的模块中进行正常评估时,这才有用。

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

查找字符串中的行数 - python

我正在创建一个python电影播放器​​/制作器,我想在多行字符串中找到行数。我想知道是否有任何内置函数或可以编写代码的函数来做到这一点:x = """ line1 line2 """ getLines(x) python大神给出的解决方案 如果换行符是'\n',则nlines …

子条件的python条件覆盖 - python

我试图找到一个python代码覆盖率工具,该工具可以衡量语句中是否包含子表达式:例如,我想看看下面的示例是否涵盖了condition1 / condition2 / condtion3?if condition1 or condition2 or condition3: x = true_value python大神给出的解决方案 对此的唯一合理答案是:当前…

字符串文字中的正斜杠表现异常 - python

为什么S1和S2在撇号位置方面表现不同?S1="1/282/03/10" S2="4/107/03/10" R1="".join({"N\'" ,S1,"\'" }) R2="".join({"N\'…