📦

Python インスタンスのメンバーの状態や関数内の変数の内容を列挙する vars() 関数が便利

2024/07/01に公開

Python で作成していた Lambda がバグっていたので、調査していたところ vars() という Python の組み込み関数が便利だったので備忘録として残します。

簡単な経緯

APIGw X Lambda X Python で構築していた API がバグっていた。
調査したところ、HTTP 通信に使用している requests モジュールの Response オブジェクトに関する理解が誤っていたっぽいところまではわかった。
Response オブジェクトのメンバー一覧を確認することができれば理解の誤りを訂正できるのではと考え調べた。

vars 関数のまとめ

  • インスタンスのメンバー一覧を列挙する
  • 関数内で使用するとローカル変数の内容を列挙する

インスタンスのメンバー一覧を列挙する

例えば下記のようなクラスがあったとします。

class Animal:
    def __init__(self, name, age, sp):
        self.name = name
        self.age = age
        self.sp = sp
    def set_name(self, name):
        self.name = name
    def set_sp(self, sp):
        self.sp = sp
    def set_age(self, age):
        self.age = age

以下のように vars() 関数を使うことで、Animal インスタンスのメンバーの内容を dict 型で列挙することができます。

ichi = Animal("Ichi", 1, "Dog")
print(vars(ichi))
# -> {'name': 'Ichi', 'age': 1, 'sp': 'Dog'}

何行にもわたってインスタンスの中身に変更がかけられている場合や、外部ライブラリで定義されたクラスのインスタンスの中身を調査したい場合に便利だと思いました。

関数内で使用するとローカル変数の内容を列挙する

また、vars() 関数を関数内で使用することで、関数内で使用しているローカル変数を列挙することができます。

def set_animal():
    dog  = Animal("Pochi", 0, "Dog")
    cat  = Animal("Tama", 4, "Cat")
    bird = Animal("Mike", 1, "Bird")
    
    dog_age = dog.age
    cat_age = cat.age 
    bird_age = bird.age
    
    print(vars())

set_animal()
# -> {
#    'dog': <__main__.Animal object at 0x14f08348f970>,
#    'cat': <__main__.Animal object at 0x14f08349ccd0>,
#    'bird': <__main__.Animal object at 0x14f083425130>,
#    'dog_age': 0,
#    'cat_age': 4,
#    'bird_age': 1
# }

大きすぎる関数内ではかえって調査がしにくくなる可能性があると感じましたが、列挙できるのは便利ですね。

参考

https://docs.python.org/ja/3/library/functions.html#vars
https://neko-py.com/python-vars

Discussion