【问题标题】:How to get names of all the variables defined in methods of a class如何获取类方法中定义的所有变量的名称
【发布时间】:2017-04-28 03:55:24
【问题描述】:

我有以下课程:

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 模块,但没有成功。

【问题讨论】:

  • 您真的需要这些信息吗?
  • 错误地,我给了一些错误的变量名,现在我想验证它们.. 我的脚本很大,所以很难手动搜索所有变量名
  • @abhayj 你不能在__init__ 中声明变量吗?
  • @MarounMaroun 不,我不能在 init 中声明所有变量

标签: python class variables methods abstract-syntax-tree


【解决方案1】:

您可以使用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']

【讨论】:

  • 令人印象深刻!这只是一个随机问题,但我想知道你从哪里学到所有这些。你是通过自己检查 ast 模块来学习的吗?或者你能推荐我一个好的材料吗?
  • Python documentation 确实不错,但没有什么比玩 shell 更好了。
  • 对于这个来源,“def reverse(str): return str[::-1]”,我没有得到“str”。为什么?
【解决方案2】:
class Foo(object):
    def setUp(self):
        self.var1 = "some value"
        self.var2 = "something"
    def bar(self):
        var3 = "some value"
    def baz(self, var):
        var5 = 34


print Foo.setUp.__code__.co_varnames
print Foo.bar.__code__.co_varnames
print Foo.baz.__code__.co_varnames
Output:
('self',)
('self', 'var3')
('self', 'var', 'var5')




 #There are many more things in __code__ dict:
   # '__class__', '__cmp__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars', 'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize', 'co_varnames']

【讨论】:

  • 我可以访问其他属性,例如“co_varnames”吗?它给出了除了 setUp 函数中的变量名之外的所有变量名。
  • 非常感谢..这个链接很有帮助
【解决方案3】:

尚不能发表评论(声望不够),但这看起来像是 Iterate over object attributes in python 的副本。

试试这个:

print([a for a in dir(obj) if not a.startswith('__') and not callable(getattr(obj,a))])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2021-09-16
    • 2016-10-12
    • 1970-01-01
    • 2015-07-24
    相关资源
    最近更新 更多