0
1

python `operator.attrgetter` でオブジェクトの複数の属性を取得する

Posted at

はじめに

Pythonでオブジェクトの属性を取得する際、通常は直接 object.attribute のような形でアクセスします。しかし、複数の属性を動的に取得したい場合や、高階関数で属性を扱う場合には、operator.attrgetter が非常に便利です。この記事では、operator.attrgetter の使い方と、複数の属性を一度に取得する方法を紹介します。

image.png

operator.attrgetter とは

operator.attrgetter は、Pythonの標準ライブラリ operator モジュールに含まれる関数です。この関数は、指定された属性名(複数可)に基づいてオブジェクトから属性を取得するためのcallableオブジェクトを返します。

image.png

基本的な使い方

まず、簡単な例から見ていきましょう。

from operator import attrgetter

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

p = Person("Alice", 30)

# 単一の属性を取得
get_name = attrgetter('name')
print(get_name(p))  # 出力: Alice

# 複数の属性を取得
get_name_and_age = attrgetter('name', 'age')
print(get_name_and_age(p))  # 出力: ('Alice', 30)

実行結果:

Alice
('Alice', 30)

複数オブジェクトの属性を取得する

attrgetter は、リストやタプルなどの複数のオブジェクトに対しても使用できます。これは、mapsorted などの関数と組み合わせる際に特に便利です。

people = [
    Person("Alice", 30),
    Person("Bob", 25),
    Person("Charlie", 35)
]

# 名前のリストを取得
names = list(map(attrgetter('name'), people))
print(names)  # 出力: ['Alice', 'Bob', 'Charlie']

# 年齢でソート
sorted_people = sorted(people, key=attrgetter('age'))
for person in sorted_people:
    print(f"{person.name}: {person.age}")

実行結果:

['Alice', 'Bob', 'Charlie']
Bob: 25
Alice: 30
Charlie: 35

ネストされた属性の取得

attrgetter は、ドット記法を使用してネストされた属性にもアクセスできます。

class Address:
    def __init__(self, city):
        self.city = city

class Person:
    def __init__(self, name, address):
        self.name = name
        self.address = address

p = Person("Alice", Address("Tokyo"))

get_city = attrgetter('address.city')
print(get_city(p))  # 出力: Tokyo

実行結果:

Tokyo

まとめ

image.png

operator.attrgetter は、Pythonでオブジェクトの属性を柔軟に取得するための強力なツールです。特に以下のような場面で活躍します:

  1. 複数の属性を一度に取得したい場合
  2. 属性名を動的に指定したい場合
  3. mapfiltersorted などの高階関数と組み合わせて使用する場合
  4. コードの可読性を高めたい場合

attrgetter を使いこなすことで、より簡潔で効率的なPythonコードを書くことができます。ぜひ、日々のプログラミングに取り入れてみてください。

参考情報

より詳細な情報や公式ドキュメントについては、以下のリンクを参照してください:

これらの公式ドキュメントでは、attrgetter の詳細な使用方法や、operator モジュールに含まれる他の便利な関数についても解説されています。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1