2016-12-13 2 views
3

У меня есть следующий класс:Как получить имена всех переменных, определенных в методах класса

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, но не удался.

+0

Есть ли какой-либо причине вы действительно нужна эта информация? –

+0

По ошибке я дал несколько неправильных имен переменных, и теперь я хочу их проверить .. мой скрипт довольно большой, поэтому его трудно вручную искать все имена переменных – atg

+0

@abhayj Не можете ли вы объявить переменные в '__init__' ? – Maroun

ответ

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') 
+0

Есть ли еще такие атрибуты, как «co_varnames», к которым я могу получить доступ? он задает все имена переменных, кроме имен переменных в функции setUp. – atg

+1

Да, ознакомьтесь здесь https://docs.python.org/2.7/library/inspect.html – Notepad

+0

Большое спасибо .. эта ссылка очень полезна – atg

-1

Foo.__dict__ или vars(Foo) представляет собой словарь вида {ключ: атрибут, key2: atrribute2}

for k, v in Foo.__dict__.items(): 
    if hasattr(v, '__call__'): # type function check 
    items.append(k) # method name 
    items += v.__code__.co_names 
    for var in v.__code__.co_varnames: 
     if var != "self": 
      items.append(var) # var name 

print items 

выход

['bar', 'var3', 'setUp', 'var1', 'var2', 'baz', 'var', 'var4'] 
+0

Вы пытались запустить его в классе в вопросе? – Maroun

+0

Thanx для ответа .. Он дает имена переменных, но также дает ключевые слова (что очень много избыточной информации) – atg

1

Не могу пока комментировать (не хватает репутации) , но это похоже на дубликат Iterate over object attributes in python.

Попробуйте это:

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

Вы можете использовать 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']