从解释器中的python对象获取ast

从解释器中的python对象获取ast,python,abstract-syntax-tree,Python,Abstract Syntax Tree,我正在构建一个应用程序,我希望一个天真的用户为它定义一个简单的函数。然后,我想把这个函数转换成一个抽象语法树。这也应该在交互式会话期间起作用(即使用口译员)。以下是我迄今为止在解释器中尝试的内容: >>> import MyLib >>> def f(x): return x**2 >>> f = MyLib.FunctionAST(f) #FunctionAST will handld the conversion to abstract

我正在构建一个应用程序,我希望一个天真的用户为它定义一个简单的函数。然后,我想把这个函数转换成一个抽象语法树。这也应该在交互式会话期间起作用(即使用口译员)。以下是我迄今为止在解释器中尝试的内容:

>>> import MyLib
>>> def f(x): return x**2
>>> f = MyLib.FunctionAST(f) #FunctionAST will handld the conversion to abstract syntax
  • dill.source.getsource
    方法
  • inspect.getsource
    方法
  • 访问函数对象的
    属性
前两种方法有问题,因为它们需要将函数对象写入系统中某个物理文件中。第三个只给了我一个字节码版本的代码,不能在
ast.parse
方法中使用

我也愿意将python对象直接转换为抽象语法,但这似乎是可行的

我真的需要能够在一个常规(不是ipython)解释器中从python对象获取ast。我该怎么做

编辑

下面是我的“天真用户”如何通过解释器与我的自定义库交互:

>>> import MyLib
>>> def f(x): return x**2
>>> f = MyLib.FunctionAST(f) #FunctionAST will handld the conversion to abstract syntax

用户是否向您提供函数对象或源代码?如果是前者,在您无法访问源代码的情况下,他们如何做到这一点?用户写出函数并通过传入函数对象实例化我正在创建的类。有关示例,请参见编辑到原始问题。此问题的搜索词为“反编译”-如果函数的源代码不可用,则必须反编译其字节码。反编译在哪里?我到处都找不到它??你能举个例子吗?我想让它尽可能灵活。。。我不希望强制用户使用任何特定的shell,而是在任何pythonshell中都可以使用。有没有一种干净的方法来强制使用ipython?用户是否给你函数对象或源代码?如果是前者,在您无法访问源代码的情况下,他们如何做到这一点?用户写出函数并通过传入函数对象实例化我正在创建的类。有关示例,请参见编辑到原始问题。此问题的搜索词为“反编译”-如果函数的源代码不可用,则必须反编译其字节码。反编译在哪里?我到处都找不到它??你能举个例子吗?我想让它尽可能灵活。。。我不希望强制用户使用任何特定的shell,而是在任何pythonshell中都可以使用。有没有一种干净的方法可以强制使用ipython?