継承されるデータクラスにオプションのフィールドを作成するにはどうすればよいですか?

スパークスター
from typing import Optional

@dataclass
class Event:
   id: str
   created_at: datetime
   updated_at: Optional[datetime]
   #updated_at: datetime = field(default_factory=datetime.now)  CASE 1
   #updated_at: Optional[datetime] = None                       CASE 2

@dataclass
class NamedEvent(Event):
  name: str

イベントインスタンスを作成するとき、通常、updated_atフィールドはありませんcurrent timeデータベースに挿入するときにデフォルト値として渡すか、値を追加して、オブジェクトの後続の使用でフェッチすることができます。どちらが良い方法ですか?私の理解では、nameフィールドにデフォルト値がないため、case1とcase2のupdated_atフィールドを渡さずにNamedEventインスタンス作成することはできません

Arne

あなたが抱えている根本的な問題は、ここで説明されているものと同じようですその投稿の短いバージョンは、関数シグネチャ(データクラスで生成された__init__メソッドを含む)では、必須の引数(NamedEventのようなname)はデフォルト値(イベントの動作を定義するために必要)を持つ引数の後に続くことができないということですupdated_at-子のフィールド常にその親のものの後に続きます。

したがって、親クラスにデフォルト値がない(この場合は機能しません)か、すべての子のフィールドにデフォルト値が必要です(これは煩わしく、場合によっては単に実行不可能です)。

上でリンクした投稿では、問題を解決するために適用できるいくつかのパターンについて説明していますが、より良い代替手段として、pydanticこの問題をすでに解決しているサードパーティのパッケージ使用することもできます。サンプル実装は次のようになります。

import pydantic
from datetime import datetime


class Event(pydantic.BaseModel):
    id: str
    created_at: datetime = None
    updated_at: datetime = None

    @pydantic.validator('created_at', pre=True, always=True)
    def default_created(cls, v):
        return v or datetime.now()

    @pydantic.validator('updated_at', pre=True, always=True)
    def default_modified(cls, v, values):
        return v or values['created_at']


class NamedEvent(Event):
    name: str

バリデーターによるデフォルト値の指定は少し面倒ですが、全体として、データクラスを使用するときに遭遇する多くの欠点に加えて、いくつかの欠点を修正する非常に便利なパッケージです。

クラス定義を使用して、のインスタンスを次のNamedEventように作成できます。

>>> NamedEvent(id='1', name='foo')
NamedEvent(id='1', created_at=datetime.datetime(2020, 5, 2, 18, 50, 12, 902732), updated_at=datetime.datetime(2020, 5, 2, 18, 50, 12, 902732), name='foo')

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

フィールドオプションYEARのみで構成されるフォームを作成するにはどうすればよいですか?

分類Dev

オプションのフィールドを持つ既存のインターフェイスからナロータイプスクリプトインターフェイスを作成するにはどうすればよいですか?

分類Dev

親クラスに C++ のデフォルト コンストラクターがない場合、継承されたクラスでコンストラクターを使用するにはどうすればよいですか?

分類Dev

Angular Materialの必須フィールドからアスタリスクを削除し、オプションラベルのラベルの横に(オプション)を追加するにはどうすればよいですか?

分類Dev

エクスプレスルートでオプションのパラメータ名を作成するにはどうすればよいですか?

分類Dev

クラスにインターフェイスを実装し、別のクラスから継承させるにはどうすればよいですか?

分類Dev

クラスがインターフェイスから継承されている場合、List <Interface>オブジェクトのプロパティにアクセスするにはどうすればよいですか?

分類Dev

データクラス(Kotlin)をスーパークラスから拡張し、スーパークラスフィールドの1つを継承するにはどうすればよいですか?

分類Dev

静的ファクトリーメソッドでオーバーライドされたメソッドでインスタンスを作成するときに、囲んでいるクラスのプライベートフィールドにアクセスするにはどうすればよいですか?

分類Dev

最初のショー画面内にオンボーディング/ウォークスルーを作成するにはどうすればよいですか?

分類Dev

フィールドをオプションにするにはどうすればよいですか?

分類Dev

Circeでオプションタイプのカスタムエンコーディングを作成するにはどうすればよいですか?

分類Dev

動的に作成されたフィルターをSQLServerのストアドプロシージャのパラメーターとして渡し、データをフィルター処理するにはどうすればよいですか?

分類Dev

データクラスに非フィールドインスタンスレベル変数を作成するにはどうすればよいですか?

分類Dev

オプションのパラメーターを使用してコンストラクターを作成するにはどうすればよいですか?

分類Dev

F#でインターフェイスを継承する抽象クラスを作成するにはどうすればよいですか?

分類Dev

アプリケーションディレクトリで生成されないように、サードパーティコンポーネントのDCUファイルを作成するにはどうすればよいですか?

分類Dev

継承されたクラスの拡張機能の関数をオーバーライドするにはどうすればよいですか?

分類Dev

バックグラウンドで実行されているオーディオ/ビデオを再生/一時停止するためのキーボードショートカットを作成するにはどうすればよいですか?

分類Dev

ubuntuをインストールした後にディスクパーティションを作成し、d、e&gドライブのデータを失わないようにするにはどうすればよいですか?

分類Dev

オプションのDateTimeパラメータを作成するにはどうすればよいですか?

分類Dev

システム全体の(ネイティブ)オーディオエフェクトをすべてメディアプレーヤーアプリに継承するにはどうすればよいですか?

分類Dev

この弱い警告を修正するにはどうすればよいですか?「このフィールドは、継承されたゲッターまたはセッターをオーバーライドしません。」

分類Dev

oozieワークフローxmlでオプションのコマンドライン引数を作成するにはどうすればよいですか

分類Dev

プログラムで注文を作成するときにカスタムオプションフィールドの値を保存するにはどうすればよいですか?

分類Dev

コレクションにデータを入力したときにクエリで返されないように、Mongoose / MongoDBのパスワードフィールドを保護するにはどうすればよいですか?

分類Dev

ループ画像のスライドショーを作成するにはどうすればよいですか?

分類Dev

rubyのメソッドのオプションパラメータのデフォルト値を調べるにはどうすればよいですか?

分類Dev

ケースクラスのオプションのインスタンスを作成するにはどうすればよいですか?

Related 関連記事

  1. 1

    フィールドオプションYEARのみで構成されるフォームを作成するにはどうすればよいですか?

  2. 2

    オプションのフィールドを持つ既存のインターフェイスからナロータイプスクリプトインターフェイスを作成するにはどうすればよいですか?

  3. 3

    親クラスに C++ のデフォルト コンストラクターがない場合、継承されたクラスでコンストラクターを使用するにはどうすればよいですか?

  4. 4

    Angular Materialの必須フィールドからアスタリスクを削除し、オプションラベルのラベルの横に(オプション)を追加するにはどうすればよいですか?

  5. 5

    エクスプレスルートでオプションのパラメータ名を作成するにはどうすればよいですか?

  6. 6

    クラスにインターフェイスを実装し、別のクラスから継承させるにはどうすればよいですか?

  7. 7

    クラスがインターフェイスから継承されている場合、List <Interface>オブジェクトのプロパティにアクセスするにはどうすればよいですか?

  8. 8

    データクラス(Kotlin)をスーパークラスから拡張し、スーパークラスフィールドの1つを継承するにはどうすればよいですか?

  9. 9

    静的ファクトリーメソッドでオーバーライドされたメソッドでインスタンスを作成するときに、囲んでいるクラスのプライベートフィールドにアクセスするにはどうすればよいですか?

  10. 10

    最初のショー画面内にオンボーディング/ウォークスルーを作成するにはどうすればよいですか?

  11. 11

    フィールドをオプションにするにはどうすればよいですか?

  12. 12

    Circeでオプションタイプのカスタムエンコーディングを作成するにはどうすればよいですか?

  13. 13

    動的に作成されたフィルターをSQLServerのストアドプロシージャのパラメーターとして渡し、データをフィルター処理するにはどうすればよいですか?

  14. 14

    データクラスに非フィールドインスタンスレベル変数を作成するにはどうすればよいですか?

  15. 15

    オプションのパラメーターを使用してコンストラクターを作成するにはどうすればよいですか?

  16. 16

    F#でインターフェイスを継承する抽象クラスを作成するにはどうすればよいですか?

  17. 17

    アプリケーションディレクトリで生成されないように、サードパーティコンポーネントのDCUファイルを作成するにはどうすればよいですか?

  18. 18

    継承されたクラスの拡張機能の関数をオーバーライドするにはどうすればよいですか?

  19. 19

    バックグラウンドで実行されているオーディオ/ビデオを再生/一時停止するためのキーボードショートカットを作成するにはどうすればよいですか?

  20. 20

    ubuntuをインストールした後にディスクパーティションを作成し、d、e&gドライブのデータを失わないようにするにはどうすればよいですか?

  21. 21

    オプションのDateTimeパラメータを作成するにはどうすればよいですか?

  22. 22

    システム全体の(ネイティブ)オーディオエフェクトをすべてメディアプレーヤーアプリに継承するにはどうすればよいですか?

  23. 23

    この弱い警告を修正するにはどうすればよいですか?「このフィールドは、継承されたゲッターまたはセッターをオーバーライドしません。」

  24. 24

    oozieワークフローxmlでオプションのコマンドライン引数を作成するにはどうすればよいですか

  25. 25

    プログラムで注文を作成するときにカスタムオプションフィールドの値を保存するにはどうすればよいですか?

  26. 26

    コレクションにデータを入力したときにクエリで返されないように、Mongoose / MongoDBのパスワードフィールドを保護するにはどうすればよいですか?

  27. 27

    ループ画像のスライドショーを作成するにはどうすればよいですか?

  28. 28

    rubyのメソッドのオプションパラメータのデフォルト値を調べるにはどうすればよいですか?

  29. 29

    ケースクラスのオプションのインスタンスを作成するにはどうすればよいですか?

ホットタグ

アーカイブ