【Python】変数名を文字列として取得する方法を解説

この記事では、Pythonプログラミングにおいて、変数名を文字列として取得する方法について解説します。

目次から探す

Pythonでの変数名を文字列として取得する方法

Pythonでは、プログラムの実行中に変数名を文字列として取得する方法がいくつかあります。

ここでは、locals()関数globals()関数vars()関数の3つの方法を紹介します。

locals()関数を使う方法

locals()関数は、現在のローカルスコープ内で定義されている変数を辞書として返します。

この辞書のキーには変数名が、値には変数の値が格納されています。

変数名を文字列として取得するためには、この辞書のキーを使用します。

以下は、locals()関数を使って変数名を文字列として取得する例です。

def func():
    x = 100
    y = 200
    # globals()のコピーを作成
    locals_vars = locals().copy()

    for var_name, var_value in locals_vars.items():
        print(f'{var_name}\t{var_value}')

z = 30
func()
x       100
y       200

上記のコードでは、locals().items()を使ってlocals()関数が返す辞書のキーと値を取得し、forループで変数名を表示しています。

宣言している変数にはzもありますが、こちらはグローバルスコープで宣言されている変数であるため、locals()関数では取得できません。ほかの関数の変数も同様に取得できず、現在のローカルスコープの変数のみ取得できます。

globals()関数を使う方法

globals()関数は、現在のグローバルスコープ内で定義されている変数を辞書として返します。

locals()関数と同様に、この辞書のキーには変数名が、値には変数の値が格納されています。

以下は、globals()関数を使って変数名を文字列として取得する例です。

def func():
    x = 100
    y = 200

z = 30

# globals()のコピーを作成
global_vars = globals().copy()

for var_name, var_value in global_vars.items():
    print(f'{var_name}\t{var_value}')
__name__        __main__
__doc__ None
__package__     None
__loader__      <_frozen_importlib_external.SourceFileLoader object at 0x0000026543741AD0>
__spec__        None
__annotations__ {}
__builtins__    <module 'builtins' (built-in)>
__file__        C:\Users\username\OneDrive\ドキュメント\blog\GeekBlocks\Source\Python\sample.py
__cached__      None
func    <function func at 0x00000265435E0680>
z       30

上記のコードでは、globals().items()を使ってglobals()関数が返す辞書のキーと値を取得し、forループで変数名を表示しています。

locals()関数を使った場合とは異なり、グローバル変数をリストアップするためxyは取得していません。

また、アンダースコアから始まる変数がいくつかリストアップされていますが、こちらは事前に定義されている変数です。

vars()関数を使う方法

vars()関数は、指定したオブジェクトの属性を辞書として返します。

デフォルトでは、vars()関数は現在のスコープの属性を返しますが、引数にオブジェクトを指定することで、そのオブジェクトの属性を取得することもできます。

以下は、vars()関数を使って変数名を文字列として取得する例です。

class MyClass:
    def __init__(self):
        self.x = 10
        self.y = 20
my_obj = MyClass()
for var_name, var_value in vars(my_obj).items():
    print(f'{var_name}\t{var_value}')
x       10
y       20

上記のコードでは、vars(my_obj).items()を使ってvars()関数が返す辞書のキーと値を取得し、forループで変数名を表示しています。

これらの方法を使うことで、Pythonで変数名を文字列として取得することができます。

プログラムのデバッグや動的な変数の操作など、さまざまな場面で活用することができます。

クラス内の変数名を文字列として取得する方法

クラス内の変数名を文字列として取得する方法には、いくつかの方法があります。

ここでは、__dict__属性を使う方法とinspectモジュールを使う方法について解説します。

__dict__属性を使う方法

Pythonのクラスは、__dict__という特殊な属性を持っています。

この属性には、クラス内で定義された変数やメソッドが辞書形式で格納されています。

そのため、__dict__属性を使うことで、クラス内の変数名を文字列として取得することができます。

以下は、SampleClassというクラス内の変数名を文字列として取得する例です。

class SampleClass:
    def __init__(self):
        self.name = "John"
        self.age = 25
sample = SampleClass()
# クラス内の変数名を文字列として取得する
variable_names = list(sample.__dict__.keys())
print(variable_names)
['name', 'age']

上記の例では、SampleClassのインスタンスを作成し、__dict__属性を使って変数名を文字列として取得しています。

list()関数を使って辞書のキーをリストに変換しています。

inspectモジュールを使う方法

inspectモジュールは、Pythonのオブジェクトに関する情報を取得するためのモジュールです。

クラス内の変数名を文字列として取得するためには、inspectモジュールのgetmembers()関数を使うことができます。

以下は、SampleClassというクラス内の変数名を文字列として取得する例です。

import inspect
class SampleClass:
    def __init__(self):
        self.name = "John"
        self.age = 25
sample = SampleClass()
# クラス内の変数名を文字列として取得する
variable_names = [name for name, _ in inspect.getmembers(sample) if not name.startswith('__') and not inspect.ismethod(_)]
print(variable_names)
['name', 'age']

上記の例では、SampleClassのインスタンスを作成し、inspect.getmembers()関数を使って変数名を文字列として取得しています。

getmembers()関数は、指定したオブジェクトの属性やメソッドを取得するための関数です。

リスト内包表記を使って、取得した属性のうち、__で始まるものやメソッドを除外しています。

これらの方法を使うことで、クラス内の変数名を文字列として取得することができます。

モジュール内の変数名を文字列として取得する方法

モジュール内の変数名を文字列として取得する方法には、主にdir()関数inspectモジュールを使う方法があります。

dir()関数を使う方法

dir()関数は、指定したオブジェクトが持つ属性やメソッドの一覧を返す組み込み関数です。

モジュールもオブジェクトの一種なので、dir()関数を使ってモジュール内の変数名を取得することができます。

以下は、mathモジュールを例にして、dir()関数を使ってモジュール内の変数名を取得するコードの例です。

import math
variables = dir(math)
for variable in variables:
    print(variable)

実行結果は以下のようになります。

__doc__
__loader__
__name__
__package__
__spec__
acos
acosh
asin
asinh
atan
atan2
atanh
cbrt
ceil
comb
copysign
cos
cosh
degrees
dist
e
erf
erfc
exp
exp2
expm1
fabs
factorial
floor
fmod
frexp
fsum
gamma
gcd
hypot
inf
isclose
isfinite
isinf
isnan
isqrt
lcm
ldexp
lgamma
log
log10
log1p
log2
modf
nan
nextafter
perm
pi
pow
prod
radians
remainder
sin
sinh
sqrt
tan
tanh
tau
trunc
ulp

dir()関数は、モジュール内の変数名だけでなく、モジュール自体が持つ特殊な属性やメソッドも含まれますので、注意が必要です。

inspectモジュールを使う方法

inspectモジュールは、Pythonのオブジェクトに関する情報を取得するためのモジュールです。

inspectモジュールを使うことで、モジュール内の変数名を取得することもできます。

以下は、mathモジュールを例にして、inspectモジュールを使ってモジュール内の変数名を取得するコードの例です。

import math
import inspect
variables = [name for name, obj in inspect.getmembers(math) if not name.startswith('_')]
print(variables)

実行結果は以下のようになります。

radians
acos
acosh
asin
asinh
atan
atan2
atanh
cbrt
ceil
comb
copysign
cos
cosh
degrees
dist
e
erf
erfc
exp
exp2
expm1
fabs
factorial
floor
fmod
frexp
fsum
gamma
gcd
hypot
inf
isclose
isfinite
isinf
isnan
isqrt
lcm
ldexp
lgamma
log
log10
log1p
log2
modf
nan
nextafter
perm
pi
pow
prod
radians
remainder
sin
sinh
sqrt
tan
tanh
tau
trunc
ulp

inspect.getmembers()関数は、指定したオブジェクトの属性やメソッドの一覧を返します。

ここでは、mathモジュールの属性やメソッドの一覧を取得し、nameobjのペアを使って変数名を抽出しています。

inspectモジュールを使うことで、より細かい制御が可能になります。

例えば、特定の条件に合致する変数名のみを取得するなど、柔軟な操作が可能です。

以上が、モジュール内の変数名を文字列として取得する方法です。

dir()関数inspectモジュールを使うことで、Pythonのモジュール内の変数名を簡単に取得することができます。

ライブラリを使った変数名の取得方法

Pythonでは、astモジュールやtokenizeモジュールを使用することで、変数名を文字列として取得することができます。

これらのモジュールは、ソースコードを解析して構文やトークンを取得するための機能を提供しています。

astモジュールを使う方法

astモジュールは、抽象構文木(Abstract Syntax Tree)を操作するためのモジュールです。

抽象構文木は、ソースコードの構文構造を表現するデータ構造であり、変数名や関数名などの識別子も含まれています。

以下は、astモジュールを使用して変数名を取得する例です。

import ast
def get_variable_names(code):
    tree = ast.parse(code)
    variable_names = []
    for node in ast.walk(tree):
        if isinstance(node, ast.Name):
            variable_names.append(node.id)
    return variable_names
# サンプルコード
code = '''
x = 10
y = 20
z = x + y
print(z)
'''
variable_names = get_variable_names(code)
print(variable_names)
['x', 'y', 'z', 'x', 'y', 'print', 'z']

上記の例では、get_variable_namesという関数を定義し、引数として与えられたコードを解析して変数名を取得しています。

ast.parse関数を使用してコードを解析し、ast.walk関数を使用して抽象構文木を走査します。

isinstance関数を使用してノードが変数名を表すast.Nameクラスであるかを判定し、変数名をリストに追加しています。

tokenizeモジュールを使う方法

tokenizeモジュールは、ソースコードをトークンに分割するためのモジュールです。

トークンは、ソースコードの最小単位であり、変数名や演算子などが含まれています。

以下は、tokenizeモジュールを使用して変数名を取得する例です。

import tokenize
from io import BytesIO
def get_variable_names(code):
    variable_names = []
    tokens = tokenize.tokenize(BytesIO(code.encode('utf-8')).readline)
    for token in tokens:
        if token.type == tokenize.NAME:
            variable_names.append(token.string)
    return variable_names
# サンプルコード
code = '''
x = 10
y = 20
z = x + y
print(z)
'''
variable_names = get_variable_names(code)
print(variable_names)
['x', 'y', 'z', 'x', 'y', 'print', 'z']

上記の例では、get_variable_namesという関数を定義し、引数として与えられたコードをトークンに分割して変数名を取得しています。

tokenize.tokenize関数を使用してコードをトークンに分割し、token.typeを使用してトークンの種類が変数名を表すtokenize.NAMEであるかを判定し、変数名をリストに追加しています。

これらの方法を使用することで、Pythonのソースコードから変数名を文字列として取得することができます。

これは、デバッグやコード解析などの用途に役立つことがあります。

目次から探す