Frozenと比較のオプション
変更不可で順序付け可能なデータクラスを作ります
「Frozenと比較のオプション」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。
デコレーターのオプション
@dataclassデコレーターは、生成するメソッドを制御するキーワード引数を受け取ります。特に便利なのはfrozenとorderです。
frozen=Trueにすると、インスタンスが変更不可能になります。order=Trueにすると、比較演算子が追加されます。
凍結されたデータクラス
frozen=Trueにすると、生成されたクラスは構築後の属性への代入を禁止します。代入しようとするとFrozenInstanceErrorが発生します。
from dataclasses import dataclass, FrozenInstanceError
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
try:
p.x = 99
except FrozenInstanceError as e:
print('Cannot modify:', e)不変性の利点
不変オブジェクトは扱いやすくなります。作成後に値が変わらないため、関数間やスレッド間で安全に共有できます。また、辞書のキーや集合の要素としても安全に使用できます。
凍結するとハッシュ化可能
凍結データクラスはデフォルトでハッシュ化可能なので、インスタンスを集合の要素や辞書のキーとして使えます。可変データクラスは、明示的に有効にしない限りハッシュ化できません。
from dataclasses import dataclass
@dataclass(frozen=True)
class Point:
x: int
y: int
seen = {Point(0, 0), Point(1, 1), Point(0, 0)}
print(len(seen))凍結された値の置き換え
凍結されたインスタンスは変更できないため、dataclasses.replace()を使って変更後のコピーを作成します。元のインスタンスは変更されません。
from dataclasses import dataclass, replace
@dataclass(frozen=True)
class Point:
x: int
y: int
p = Point(1, 2)
q = replace(p, y=99)
print(p)
print(q)順序付きデータクラス
デフォルトでは、データクラスがサポートするのは==だけです。order=Trueを追加すると、<、<=、>、>=も生成されます。
from dataclasses import dataclass
@dataclass(order=True)
class Version:
major: int
minor: int
print(Version(1, 2) < Version(1, 5))
print(Version(2, 0) > Version(1, 9))順序付けでの比較
順序付けでは、宣言された順序に従ってフィールドを左から右へタプルとして比較します。最初のフィールドが最も重要です。
from dataclasses import dataclass
@dataclass(order=True)
class Version:
major: int
minor: int
# major compared first, then minor
print(Version(1, 9) < Version(2, 0))データクラスインスタンスのソート
順序付きデータクラスでは比較演算子が定義されるため、sorted()を使ってリストを直接ソートできます。
from dataclasses import dataclass
@dataclass(order=True)
class Score:
points: int
name: str
data = [Score(50, 'B'), Score(90, 'A'), Score(70, 'C')]
for s in sorted(data):
print(s)ソートキーの制御
自然なフィールド順序以外の基準でソートするには、field(init=False)を使って非表示のソートフィールドを先頭に配置し、__post_init__で設定します。他のフィールドはcompare=Falseで比較対象から除外できます。
from dataclasses import dataclass, field
@dataclass(order=True)
class Item:
sort_index: int = field(init=False, repr=False)
name: str = field(compare=False, default='')
priority: int = 0
def __post_init__(self):
self.sort_index = self.priority
print(Item(name='b', priority=2) > Item(name='a', priority=1))凍結と順序付けの組み合わせ
オプションは組み合わせることができます。凍結された順序付きデータクラスは、キーやバージョン番号、座標などに適した、完全な不変かつ比較可能な値型になります。
from dataclasses import dataclass
@dataclass(frozen=True, order=True)
class SemVer:
major: int
minor: int
patch: int
versions = {SemVer(1, 0, 0): 'stable'}
print(SemVer(1, 0, 0) < SemVer(1, 1, 0))
print(versions[SemVer(1, 0, 0)])eqとデフォルト値
eqオプションは、__eq__を生成するかどうかを制御します。デフォルトはTrueです。order=Trueにはeq=Trueが必要です。これは、順序付けが等価性を基盤としているためです。
from dataclasses import dataclass
@dataclass(eq=True)
class Tag:
name: str
print(Tag('x') == Tag('x'))
print(Tag('x') == Tag('y'))確認問題
凍結データクラスのインスタンスのフィールドに値を代入すると、どうなりますか。
まとめ
不変で順序付け可能なデータクラスの作り方を学びました。
frozen=Trueは変更を禁止し、インスタンスをハッシュ化可能にします。- 変更後のコピーには
replace()を使います。 order=Trueは、フィールドをタプルとして比較する比較演算子を生成します。- 両方を組み合わせると、堅牢な値型になります。
よくある質問
「Frozenと比較のオプション」レッスンは無料ですか?
はい。「Frozenと比較のオプション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。
「Frozenと比較のオプション」で何を学びますか?
変更不可で順序付け可能なデータクラスを作ります ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Python Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「Frozenと比較のオプション」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPython Academyレッスンでコードを書いて実行できますか?
はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- データクラスを定義する
- デフォルト値とfield()
- Frozenと比較のオプション
- attrsライブラリ