小编Dan*_*nny的帖子

Python通过函数装饰器转换ast

我有个主意,可以使用类似于下面的装饰器来转换所有给定的带有标记的函数,

@transform_ast
def foo(x):
    return x
Run Code Online (Sandbox Code Playgroud)

在中transform_ast,我获得了源代码,提取了ast,对其进行了转换,然后再次从中创建代码对象和函数类型。看起来像下面的样子,

import ast
import inspect
import types

class Rewrite(ast.NodeTransformer):
    pass

def transform_ast(f):

    source = inspect.getsource(f)
    source = '\n'.join(source.splitlines()[1:]) # remove the decorator first line.
    print(source)

    old_code_obj = f.__code__
    old_ast = ast.parse(source)
    new_ast = Rewrite().visit(old_ast)
    new_code_obj = compile(new_ast, old_code_obj.co_filename, 'exec')
    new_f = types.FunctionType(new_code_obj, {})
    return new_f

@transform_ast
def foo(x):
    return x
Run Code Online (Sandbox Code Playgroud)

但是,当我随后调用foo(x)时,它似乎无法正常工作。

出于所有实际目的,我们可以假设我的转换只是重写return xreturn x+1。理想情况下,我希望所有功能都能正常运行,包括能够使用调试器进入该功能...

调用foo(10),会出现以下错误,

TypeError:module()不接受任何参数(给定1个)

我做错了什么吗?

python abstract-syntax-tree python-decorators

5
推荐指数
1
解决办法
199
查看次数

如何在 KDB+ 中按时间对结果排序

我正在做一个类似于下面的简单选择查询,

从 sym=`AAPL 的交易中选择日期、时间、价格、交易量。

我想按时间列对返回结果进行排序,但在阅读文档并尝试执行此操作后

从交易中选择[>时间]日期、时间、价格、交易量,其中 sym=`AAPL。

我收到一个错误。

有人可以建议吗?

kdb

3
推荐指数
1
解决办法
3018
查看次数