🔍

オブジェクトの中身を確認したい場合に試すこと(Python)

2022/03/09に公開約1,800字

はじめに

Pythonを勉強しているとたくさんのモジュールを使うので、オブジェクトに何が入っているのか、どういう構造なのか知りたくなります。

例えばPytorchを使った機械学習をしていると自分で作ったオブジェクトですら何が入っているのかわかりません。

インタプリタ
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True, num_workers=2)

trainloader
出力結果
<torch.utils.data.dataloader.DataLoader at 0x7f1738c0cb10>

このようにデータのアドレスが返ってくるだけのこともチラホラあります...
その時に毎回あれやこれや試しているので忘れないように記事にします。

普通に出力

これだけで中身が分かればいいのですが、世の中そんなに甘くありません...

obj

dir関数

引数に渡したオブジェクトの全ての属性(メソッドやインスタンス変数)を返します。

dir(obj)

https://python.keicode.com/refs/dir-function.php

vars関数

属性と一緒にその中に入ってる変数も出力してくれます。

vars(obj)

https://qiita.com/ganyariya/items/e01e0355c78e27c59d41

pprint関数

dir関数やvars関数は見づらい場合が多々あるのでpprint関数で整えます。
横に長い出力を整形して見やすく出力してくれます。
今までの組み込み関数と違い、pprintモジュールをインポートして使います。

import pprint

pprint.pprint(dir(obj))
pprint.pprint(vars(obj))

https://note.nkmk.me/python-pprint-pretty-print/

search関数

探したい属性の有無を確認したい場合、上のpprint関数で見やすくなったものの出力が多ければ探すのは大変です。
お目当てのものがあるかないかを出力するコードをsearch関数で作りました。
reモジュールをインポートするのを忘れないでください。

import re

for line in obj:
    if re.search(r'探したい名前', line):
        print("exist")

https://it-ojisan.tokyo/python-grep/

type関数

type関数を使うことでそのオブジェクトの型がわかります。
Pythonは動的型付け言語だからこそ、そのオブジェクトが何の型であるか把握しておくことは重要です。

type(obj)

次元の確認

type関数で出力された結果がもしnumpy.ndarray型なら.shapeメソッドを使ってオブジェクトの次元数を確認できます。

obj.shape

また、もし機械学習でよく使われるPytorchのtorch.Tensor型なら.size()メソッドを使ってオブジェクトの次元数を確認できます。

obj.size()

keys()メソッド

もしdict型なら.keys()メソッドを使うことで、辞書のキーを全て出力することができます。
dir関数やvars関数と違いキーのみなので見やすい出力結果になります。

obj.keys()

まだまだ学習中ですので他に方法があれば追加していきます。

Discussion

ログインするとコメントできます