如何获取函数调用的别名?

时间:2014-06-05 17:02:44

标签: python tokenize

我遇到的问题是我不知道如何获取函数调用的别名。

代码的作用是跟踪文本:

"struct(...)"
代码中的

x = struct(...)

致电时:

x()

IDE如何工作'x = struct(...)'只定义了一个在树中创建缩进的调用树中的区域,它实际上并没有在文件数据中做任何事情。
当你调用'x()'时,文件数据以'color = hash(“struct(...)”)'的颜色突出显示。

所以我需要获取别名'x',以便我可以在代码中跟踪调用...


我不能完全帮助任何人复制这个,因为这样做的代码相当大......
但我只是需要一些想法,因为我似乎无法在Google上找到任何体面的例子。

我正在寻找以下案例:
显而易见:

x = struct(...)

不那么明显:

p,x,t = 0, struct(...), True

高度无关:

p,x,t = (
    0,
    struct(...),
    True )

所有导致调用x()

我正在使用tokenize来获取struct()的调用名,并且我将整个代码存储在'self.codeeditor.data'中......

如何使用“struct”获取“x”??

编辑: 我可以提一下,x将是struct()返回的动态创建的_SUB_STRUCT类的实例。

2 个答案:

答案 0 :(得分:1)

我不认为tokenize真的会在这里工作;您最好使用ast处理语法树级别并查找Assign个节点。

例如:

>>> [n.targets[0].id for n in ast.walk(ast.parse("x = struct()"))
    if isinstance(n, ast.Assign)
        and isinstance(n.value, ast.Call)
        and n.value.func.id == 'struct']
['x']

答案 1 :(得分:0)

您应该可以使用dict来获得所需的功能:

# Relates a label to a function
function_maps = {'a':str, 'b':int, 'c':print}

# Will print 'Hello World!'
function_maps['c']('Hello World!')

# Lets look for the `int` function
for key, value in function_maps.items():
    if value == int:
        print('The alias for `int` is: {}'.format(key))

如果没有看到更多代码,这就是我建议的方式。