LoginSignup
0
0

dataclasses-json:`DataClassJsonMixin`を継承しているデータクラスで`undefined`や`letter_case`を設定する場合は、`dataclass_json_config`クラス変数を設定する

Posted at

環境

やりたいこと

@dataclass_jsonにはletter_caseundefined引数で、設定を変えることができます。

from dataclasses import dataclass
from dataclasses_json import dataclass_json, Undefined, Undefined

@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.RAISE)
@dataclass
class Task:
    task_name: str
    value: int = 10

@dataclass_jsonデコレータで定義するとmypyなどのlinterに怒られる場合があるので、DataClassJsonMixinを継承してデータクラスを宣言したいです。

from dataclasses_json import DataClassJsonMixin

class Task(DataClassJsonMixin):
    task_name: int

その場合、letter_caseundefinedはどこで設定すればよいのでしょうか?

解決方法

以下のコードのように、dataclass_json_configクラス変数を用意すればよいです。

from dataclasses_json import config

@dataclass
class Task(DataClassJsonMixin):
    dataclass_json_config = config(
        letter_case=LetterCase.CAMEL,
        undefined=Undefined.EXCLUDE
    )["dataclasses_json"]

    task_name: str
    value: int = 10

以下のissueにコードが記載されていました。

なおdataclass_json_configには型ヒントを指定してはいけません。型ヒントを指定すると、データクラスのフィールドみなされてしまい、エラーが発生します。

@dataclass
class Task(DataClassJsonMixin):
    dataclass_json_config: Any = config(
        letter_case=LetterCase.CAMEL,
        undefined=Undefined.EXCLUDE
    )["dataclasses_json"]

    task_name: str
    value: int = 10
$ python sample.py
...
ValueError: mutable default <class 'dict'> for field dataclass_json_config is not allowed: use default_factory
0
0
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
0