python - 如何获取类方法中定义的所有变量的名称

标签 python class variables methods abstract-syntax-tree

我有以下类(class):

class Foo(object):
    def setUp(self):
        self.var1 = "some value"
        self.var2 = something
    def bar(self):
        var3 = some value
    def baz(self, var):
        var4 = some value

我想打印方法中定义的所有变量的名称,例如:

setUp, bar, baz, var1, var2, var3, var4

我试过使用 locals()、vars()、globals(),但我只得到方法的名称,而不是变量名称。

我也尝试过使用 ast 模块,但没有成功。

最佳答案

您可以使用 ast.parse生成AST节点。那么ast.walk可用于递归迭代节点及其后代。对于每个节点,您可以检查类型,然后提取正确的属性。

下面是一个使用您的代码的示例,但不要指望它能像这样处理更复杂的文件:

source = '''
class Foo(object):
    def setUp(self):
        self.var1 = "some value"
        self.var2 = 1
    def bar(self):
        var3 = 2
    def baz(self, var):
        var4 = var
'''

import ast

def hack(source):
    root = ast.parse(source)

    for node in ast.walk(root):
        if isinstance(node, ast.Name) and isinstance(node.ctx, ast.Store):
            yield node.id
        elif isinstance(node, ast.Attribute):
            yield node.attr
        elif isinstance(node, ast.FunctionDef):
            yield node.name

print(list(hack(source)))

输出:

['setUp', 'bar', 'baz', 'var1', 'var2', 'var3', 'var4']

关于python - 如何获取类方法中定义的所有变量的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41115160/

相关文章:

python - 如何在用户输入错误时重新加载具有无效表单的页面

带女服务员的 Python Dash 服务器

java - 模拟一类enum类型

python - Matplotlib - 颜色作为已标准化数据的第三个变量 - 不是灰度

android - 将一个从适配器类动态变化的整数变量传递给 Activity

python - 正则表达式,而不是声明

python - 参数化 'SELECT IN (...)' 查询

java - 如何知道某个类是否扩展了 JWindow 类?

java - 从另一个类访问变量

delphi - 将 TListBox 选定行的内容存储在变量上