Pythonにはgetattr
という組み込み関数があります。この関数は、オブジェクトの属性を動的に取得するために使用されます。しかし、この関数は大文字と小文字を区別します。つまり、属性名が大文字である場合と小文字である場合では、異なる結果が返されます。
しかし、場合によっては、大文字と小文字を区別せずに属性を取得したいことがあります。そのような場合には、次のような関数を作成することができます。
def getattr_case_insensitive(obj, attr_name):
for name in dir(obj):
if name.lower() == attr_name.lower():
return getattr(obj, name)
raise AttributeError(f'object has no attribute {attr_name}')
この関数は、指定されたオブジェクトのすべての属性を調べ、大文字と小文字を区別せずに指定された属性名と一致するものを探します。一致する属性が見つかった場合、その属性の値を返します。一致する属性が見つからなかった場合、AttributeError
を発生させます。
この関数を使用すると、次のように大文字と小文字を区別せずに属性を取得することができます。
class MyClass:
def __init__(self):
self.myAttribute = 123
obj = MyClass()
print(getattr_case_insensitive(obj, 'myattribute')) # prints: 123
このように、Pythonのgetattr
関数と大文字小文字を区別しない属性アクセスを組み合わせることで、より柔軟なコードを書くことができます。