Python vars() – __dict__ 属性を検索する

スポンサーリンク

今回は、オブジェクトの __dict__ 属性を返す Python vars() 関数の使い方を見ていきましょう。

これは珍しい関数ですが、特定の状況で役に立つので、どのように使うかを見るのに役立ちます。

では、具体的な例を使って、これらの状況を見てみましょう。


スポンサーリンク

Python vars() のシンタックス

この関数はオブジェクト obj を引数にとり、以下のような形式で実行される。

vars([obj])

これは obj__dict__ 属性を返す。

この属性には、書き込み可能なオブジェクトのすべての属性が含まれる。

ここで、obj には、モジュール / クラス / クラスのインスタンスなどを指定することができます

ここで、引数の型と数によって、いくつかのケースがある。

  • 引数を与えない場合、Pythonの vars()locals() メソッドと同じように動作し、現在のローカルシンボルテーブルを持つ辞書を返します。
  • このメソッドは __dict__ 属性を返すので、もしオブジェクトがこの属性を持っていなければ、 TypeError 例外が発生します。

それでは、異なるオブジェクトに関連するいくつかの例を見てみましょう。


Python の vars() を引数なしで使う場合

前述のように、これは locals() メソッドとして動作し、ローカルシンボルテーブルの辞書を返します。

print(vars())

結果は以下の通りです。

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x108508390>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/vijay/home/python_vars_function.py', '__cached__': None, 'Data': <class '__main__.Data'>, 'd': <__main__.Data object at 0x108565048>, 'math': <module 'math' from '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload/math.cpython-36m-darwin.so'>}

Python vars() をクラスオブジェクトで使う

もし obj がクラスタイプ、またはクラスのインスタンスであるなら、この場合 vars() が何をするのかを見てみましょう。

ここでは、クラス MyClass を作成し、その __init__() メソッドにいくつかの属性を定義してみましょう。

class MyClass:
    def __init__(self, i, j):
        self.a = i
        self.b = j
 
m = MyClass(10, 20)
print(vars(m))
print(vars(MyClass))

結果は以下の通りです。

{'a': 10, 'b': 20}
{'__module__': '__main__', '__init__': <function MyClass.__init__ at 0x000001C24EA129D8>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, '__doc__': None}

クラスインスタンスの場合、 vars() は関連するすべての属性 ab を、その値とともに返します。

一方、クラス MyClass の場合は、main モジュールの下にカプセル化されており、クラスの __dict__ 属性と共に __init__ メソッドを持っています。

vars()__repr____dict__ などのすべてのダンダメソッドを呼び出します。

そのため、ダンダーのメソッドを呼び出すよりも、この関数を直接呼び出すことができれば便利です。

(このような違いはありませんが)。

同様に、 vars()strlist のような他のオブジェクトやクラスでも使用することができる。

print(vars(str))
print(vars(list))

これで、両方のクラスについて、関連するすべての属性とインスタンスメソッドが表示されます。

モジュール上でvars()を使用する

この関数はモジュールに対しても使うことができ、そのモジュールが含むすべてのメソッドと、その他の関連情報、そしてドキュメントストリングを見つけることができます

例えば、組み込みモジュールの antigravity (これはイースターエッグです!) を調べたい場合、それをインポートして vars(antigravity) を調べます。

import antigravity
 
print(vars(antigravity))

出力例 (最後の数行)

{'__name__': 'antigravity', '__doc__': None, '__package__': '', 'TimeoutError': <class 'TimeoutError'>, 'open': <built-in function open>, 'quit': Use quit() or Ctrl-Z plus Return to exit, 'exit': Use exit() or Ctrl-Z plus Return to exit, 'copyright': Copyright (c) 2001-2018 Python Software Foundation.
All Rights Reserved.
 
Copyright (c) 2000 BeOpen.com.
All Rights Reserved.
 
Copyright (c) 1995-2001 Corporation for National Research Initiatives.
All Rights Reserved.
}

もし、 __dict__ 属性を持たないオブジェクト (例えば int) に対して vars() を使用すると、 TypeError が発生します。

print(vars(12))
Traceback (most recent call last):
  File "vars_example.py", line 12, in <module>
    print(vars(12))
TypeError: vars() argument must have __dict__ attribute

まとめ

この記事では、任意のクラス/モジュール/オブジェクトの属性とすべての代表的なメソッドをすばやく取得したい場合に便利な Python vars() 関数について見てきました。


タイトルとURLをコピーしました