如何获取脚本中使用的所有变量和方法名称

法哈瓦

可能很奇怪,但我正在寻找一种自动获取python脚本中所有变量和方法的方法。

例如,

a = 1
b = 2
c = 3
myList = range(10)

def someMethod(x): 
    something = do_something()
    return something

f = someMethod(b)

print f

我想得到

a, b, c, someMethod, something, f

这是一个演示示例,我想针对更大的脚本进行此操作。

暗影游侠

ast模块可以很容易地做到这一点。如果我们假设源存储在名为source(可以从文件读取)的变量中

import ast

root = ast.parse(source)
names = sorted({node.id for node in ast.walk(root) if isinstance(node, ast.Name)})

这样就失去了获得唯一性和友好的显示顺序的顺序,但是如果您不需要唯一性但想要排序,则可以只使用列表推导或生成器表达式来代替集合推导。结果list是:

['a', 'b', 'c', 'do_something', 'f', 'myList', 'range', 'someMethod', 'something', 'x']

与到目前为止发布的其他解决方案不同,这将递归到类和函数中以在其中使用名称,并且不需要您导入要检查的模块或类,也不需要您自己实现递归处理;任何语法上有效的Python代码都可以使用。

奇怪的是,在Python 3上(替换为有效的print函数调用),您得到:

 ['a', 'b', 'c', 'do_something', 'f', 'myList', 'print', 'range', 'someMethod', 'something']

它添加了print(按预期;现在是名称,而不是关键字语句),但是省略了x您没有要求x(接收到的参数someMethod),并且在Python 3上也没有产生它。函数原型中的名称似乎并未在ast.Name那里创建节点,请参见图。您可以ast.FunctionDef从中的arg每个条目属性将信息从节点中拉出list node.args.args,但是它可能仍然不全面。我怀疑可能会遗漏其他与定义相关的名称,例如在带有继承的类声明中。您需要仔细研究一些示例,以确保您检查了所有内容(假设您想要类似的东西x并且想要在Python 3上工作)。

就是说,x如果您引用它它将很好地显示出来;如果您将其传递给do_something或使用了它(除了接收和丢弃它之外),它还会显示出来。

您也可以作出努力,分配给,不使用(排除只手柄名称do_somethingrange由测试延伸至):

names = sorted({node.id for node in ast.walk(root) if isinstance(node, ast.Name) and not isinstance(node.ctx, ast.Load)})

但这也会下降someMethod(在Py2和Py3中),因为定义本身不会产生ast.Name,只有使用它会产生。如此反复,你就必须钻研得更深一些,到ast.Node内部的ast.FunctionDefast.ClassDef等拿到未的名字walk直接-ed。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Groovy获取没有继承方法的类的所有方法名称?

来自分类Dev

如何使用Groovy获取没有继承方法的类的所有方法名称?

来自分类Dev

如何获取在传递参数的lambda中使用的方法名称

来自分类Dev

如何使用proguard混淆除公共方法名称和属性以外的所有内容?

来自分类Dev

从python目录中获取所有模块名称,类名称和方法名称

来自分类Dev

获取所有服务合同方法名称

来自分类Dev

获取所有服务合同方法名称

来自分类Dev

如何避免在Objective-C方法名称中使用“和”

来自分类Dev

如何在不使用C#中使用反射的情况下从该方法内部获取方法名称

来自分类Dev

我可以在 After Test 调用中获取 @Test 的变量名称和方法名称吗?

来自分类Dev

在Rails方法名称中使用@符号

来自分类Dev

如何获取模型的方法名称数组?

来自分类Dev

smalltalk反射-如何获取方法名称?

来自分类Dev

如何在C#中使用反射获取方法的所有属性和属性数据

来自分类Dev

在Typescript中使用参数获取名为方法名称的子类

来自分类Dev

如何使用for循环更改方法名称

来自分类Dev

如何在Ruby中使用存储在数组中的方法名称来调用类方法?

来自分类Dev

Rails:如何获取Restfull命名路由的控制器和方法名称?

来自分类Dev

Javascript - 方法名称的变量?

来自分类Dev

如何从Jint的全局范围中获取所有变量(和函数名称)?

来自分类Dev

如何从Jint的全局范围中获取所有变量(和函数名称)?

来自分类Dev

获取包中声明的所有变量和常量名称

来自分类Dev

使用PostSharp时如何在原始方法中获取方法名称?

来自分类Dev

使用包含方法名称的变量调用方法

来自分类Dev

登录-获取方法名称

来自分类Dev

Rails-如何使用变量作为方法名称的一部分

来自分类Dev

从AOP调用类获取方法名称和参数

来自分类Dev

Spring bean方法:如何获取方法名称?

来自分类Dev

带有proguard的Kotlin AAR库:如何仅保留类和方法名称?

Related 相关文章

  1. 1

    如何使用Groovy获取没有继承方法的类的所有方法名称?

  2. 2

    如何使用Groovy获取没有继承方法的类的所有方法名称?

  3. 3

    如何获取在传递参数的lambda中使用的方法名称

  4. 4

    如何使用proguard混淆除公共方法名称和属性以外的所有内容?

  5. 5

    从python目录中获取所有模块名称,类名称和方法名称

  6. 6

    获取所有服务合同方法名称

  7. 7

    获取所有服务合同方法名称

  8. 8

    如何避免在Objective-C方法名称中使用“和”

  9. 9

    如何在不使用C#中使用反射的情况下从该方法内部获取方法名称

  10. 10

    我可以在 After Test 调用中获取 @Test 的变量名称和方法名称吗?

  11. 11

    在Rails方法名称中使用@符号

  12. 12

    如何获取模型的方法名称数组?

  13. 13

    smalltalk反射-如何获取方法名称?

  14. 14

    如何在C#中使用反射获取方法的所有属性和属性数据

  15. 15

    在Typescript中使用参数获取名为方法名称的子类

  16. 16

    如何使用for循环更改方法名称

  17. 17

    如何在Ruby中使用存储在数组中的方法名称来调用类方法?

  18. 18

    Rails:如何获取Restfull命名路由的控制器和方法名称?

  19. 19

    Javascript - 方法名称的变量?

  20. 20

    如何从Jint的全局范围中获取所有变量(和函数名称)?

  21. 21

    如何从Jint的全局范围中获取所有变量(和函数名称)?

  22. 22

    获取包中声明的所有变量和常量名称

  23. 23

    使用PostSharp时如何在原始方法中获取方法名称?

  24. 24

    使用包含方法名称的变量调用方法

  25. 25

    登录-获取方法名称

  26. 26

    Rails-如何使用变量作为方法名称的一部分

  27. 27

    从AOP调用类获取方法名称和参数

  28. 28

    Spring bean方法:如何获取方法名称?

  29. 29

    带有proguard的Kotlin AAR库:如何仅保留类和方法名称?

热门标签

归档