この記事では、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\eliel\OneDrive\ドキュメント\blog\CodeStream\Source\Python\sample.py
__cached__ None
func <function func at 0x00000265435E0680>
z 30
上記のコードでは、globals().items()
を使ってglobals()関数
が返す辞書のキーと値を取得し、for
ループで変数名を表示しています。
locals()関数
を使った場合とは異なり、グローバル変数をリストアップするためx
とy
は取得していません。
また、アンダースコアから始まる変数がいくつかリストアップされていますが、こちらは事前に定義されている変数です。
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
モジュールの属性やメソッドの一覧を取得し、name
とobj
のペアを使って変数名を抽出しています。
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のソースコードから変数名を文字列として取得することができます。
これは、デバッグやコード解析などの用途に役立つことがあります。