環境
- Python 3.11.2
- dataclasses-json 0.5.7
やりたいこと
@dataclass_json
にはletter_case
やundefined
引数で、設定を変えることができます。
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_case
やundefined
はどこで設定すればよいのでしょうか?
解決方法
以下のコードのように、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