0Pricing
Python Academy · レッスン

デフォルト値とfield()

デフォルト値を設定し、field()のオプションを使います

「デフォルト値とfield()」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

フィールドへのデフォルト値の設定

関数の引数と同じように、データクラスのフィールドにもデフォルト値を設定できます。デフォルト値のあるフィールドは、インスタンス作成時に省略できます。

from dataclasses import dataclass

@dataclass
class Server:
    host: str
    port: int = 8080

print(Server('localhost'))
print(Server('example.com', 443))

順序が重要

デフォルト値のあるフィールドは、デフォルト値のないフィールドの後に置く必要があります。これは関数の引数とまったく同じです。そうしないと、クラス定義時にPythonがTypeErrorを発生させます。

from dataclasses import dataclass

@dataclass
class User:
    name: str       # required
    active: bool = True   # optional

print(User('Alice'))

変更可能なデフォルト値の罠

リストや辞書などの変更可能なオブジェクトを、直接デフォルト値として使用することはできません。すべてのインスタンスが同じオブジェクトを共有してしまうためです。Pythonはこれを検出し、保護のためにValueErrorを発生させます。

from dataclasses import dataclass
from typing import List

# This raises ValueError at class definition time:
try:
    @dataclass
    class Bad:
        items: List[int] = []
except ValueError as e:
    print('Error:', e)

field(default_factory=...)

変更可能なデフォルト値を設定するには、field(default_factory=...)を使用します。ファクトリーは新しいインスタンスごとに呼び出されるため、各インスタンスは新しいオブジェクトをそれぞれ持ちます。

from dataclasses import dataclass, field
from typing import List

@dataclass
class Cart:
    items: List[str] = field(default_factory=list)

a = Cart()
a.items.append('apple')
b = Cart()
print(a.items, b.items)

defaultとdefault_factory

他のfield()オプションも必要な場合、変更不可能な値にはfield(default=...)を使用します。変更可能な値にはdefault_factoryを使用します。両方を同時に渡すことはできません。

from dataclasses import dataclass, field

@dataclass
class Config:
    retries: int = field(default=3)
    tags: list = field(default_factory=list)

print(Config())

reprからのフィールドの除外

repr=Falseオプションを使うと、生成された__repr__からフィールドを非表示にできます。秘密情報や大きな内部バッファーに便利です。

from dataclasses import dataclass, field

@dataclass
class Account:
    user: str
    token: str = field(repr=False, default='secret')

print(Account('alice'))

比較対象からのフィールドの除外

compare=Falseを指定すると、生成された__eq__(および順序比較)でそのフィールドが無視されます。そのフィールドが異なっていても、2つのインスタンスが等しいと判定される場合があります。

from dataclasses import dataclass, field

@dataclass
class Event:
    name: str
    timestamp: float = field(compare=False, default=0.0)

print(Event('login', 1.0) == Event('login', 99.0))

init=Falseフィールド

init=Falseを設定すると、フィールドが__init__から除外されます。通常はデフォルト値を組み合わせるか、__post_init__で値を設定します。

from dataclasses import dataclass, field

@dataclass
class Circle:
    radius: float
    area: float = field(init=False, default=0.0)

c = Circle(2.0)
print(c)

派生値のための__post_init__

__post_init__を定義すると、生成された__init__の直後にコードを実行できます。他のフィールドから派生するフィールドを計算するのに適した場所です。

from dataclasses import dataclass, field

@dataclass
class Circle:
    radius: float
    area: float = field(init=False, default=0.0)

    def __post_init__(self):
        self.area = 3.14159 * self.radius ** 2

print(Circle(2.0))

メタデータの保存

metadata引数を使うと、任意のマッピングをフィールドに関連付けられます。Pythonはこれを無視しますが、ツールや独自のコードから読み取って、ドキュメントや検証のヒントとして利用できます。

from dataclasses import dataclass, field, fields

@dataclass
class Product:
    price: float = field(metadata={'unit': 'USD'})

for f in fields(Product):
    print(f.name, f.metadata)

field()オプションの組み合わせ

オプションは組み合わせて指定できます。1つのフィールドをreprから隠し、比較対象から除外し、同時にデフォルト値を持たせることもできます。

from dataclasses import dataclass, field

@dataclass
class Session:
    user: str
    token: str = field(default='x', repr=False, compare=False)

print(Session('alice'))
print(Session('alice') == Session('alice', token='different'))

確認問題

データクラスのフィールドにデフォルトの空リストを設定するには、どうすればよいですか。

まとめ

デフォルト値を設定し、field()オプションを使う方法を学びました。

  • デフォルト値のあるフィールドは、必須フィールドの後に置きます。
  • 変更可能なデフォルト値にはdefault_factoryを使用します。
  • repr、compare、init、metadataで各フィールドを調整します。
  • __post_init__で派生値を計算します。

よくある質問

「デフォルト値とfield()」レッスンは無料ですか?

はい。「デフォルト値とfield()」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「デフォルト値とfield()」で何を学びますか?

デフォルト値を設定し、field()のオプションを使います ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「デフォルト値とfield()」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. データクラスを定義する
  2. デフォルト値とfield()
  3. Frozenと比較のオプション
  4. attrsライブラリ
← Python Academyに戻る