2016-12-13 17 views
3

クラスのメソッドで定義されたすべての変数の名前を取得する方法:私は次のクラス持っ

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

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 

は、私は同じように、メソッド内で定義されたすべての変数の名前を印刷したいの

私はlocals(), vars(), globals()を使用しようとしましたが、メソッドの名前と変数名だけを取得しています。

私もastモジュールを使ってみましたが、成功しませんでした。 {:属性、KEY2:キーatrribute2}

+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)は、フォームの辞書です

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の複製のように見えます。

これを試してください:あなたはASTノードを生成するためにast.parseを使用することができます

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

。次に、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'] 
関連する問題