はじめに
pythonを扱っていて、ログの解析や処理の実行中に変数の中身がどうなってるのか調べたいことありますよね?
デバッガを使うのが一番簡単なのですが、
処理の中で頻繁に値が変わったり作動中のログに変数Aには何の値が今入ってるのか調べるには、実際に変数名と値を出力するのが一番簡単だと思います。
locals(), globals()を使わない
python 変数名 取得 などで調べるとまず出てくるのが 組み込み関数のlocals(), globals()を用いる方式です。
現在使用してる名前空間(シンボルテーブル?)にアクセスして、変数名と一致するものを探索して取得する方法です。
参考: https://qiita.com/ragnar1904/items/55a21c521858802dc501
def hoge():
for variable_name, value in locals().items():
print(f"{variable_name} -> {value}")
現在の全ての変数名、値に対して取得する場合については良いですが、特定の変数名についてのみ変数名、値を取得する方法としては微妙かなと思いました。
取得方法
一通り調べてみた結論として、変数名そのものを取得する方法はなさそうだということに。
ジョージ・ジョースターⅠ世は言いました。
「逆に考えるんだ。」
逆転の発想で、変数名から値を取ればいいじゃないか。
pythonでは eval
という関数があります。文字列を式として扱う関数です。引数に変数名を与えるとその変数の値を返します。
以下のような使用方法で、変数名を文字列として扱えます。
(やってることは変数名の文字列を変数として扱ってるだけですが、やりたいことを満たすことはできると思います。)
def print_name_value(_str):
print('{}: {}'.format(_str, eval(_str)))
hoge = 0
print_name_value('hoge')
# 出力
>> hoge: 0
参考