Skip to content

Commit 750581a

Browse files
authored
Merge pull request #560 from K-dash/translate-typecheck-extension-faq-en-to-ja
Translate type-check.md, extension.md, and faq.md to Japanese
2 parents 854f0ac + f882338 commit 750581a

File tree

3 files changed

+234
-0
lines changed

3 files changed

+234
-0
lines changed

docs/ja/extension.md

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# Extending pyserde
2+
3+
pyserde はビルトイン型以外をサポートするために pyserde を拡張する 3 つの方法を提供しています。
4+
5+
## カスタムフィールド(デ)シリアライザ
6+
7+
詳細は[カスタムフィールドシリアライザ](./field-attributes.md#serializerdeserializer)を参照してください。
8+
9+
> 💡 ヒント:`serde.field` を独自のフィールド関数でラップすると以下のようになります。
10+
>
11+
> ```python
12+
> import serde
13+
>
14+
> def field(*args, **kwargs):
15+
> serde.field(*args, **kwargs, serializer=str)
16+
>
17+
> @serde
18+
> class Foo:
19+
> a: int = field(default=0) # フィールドシリアライザの設定
20+
> ```
21+
22+
## カスタムクラス(デ)シリアライザ
23+
24+
詳細は[カスタムクラスシリアライザ](./class-attributes.md#class_serializer--class_deserializer)を参照してください。
25+
26+
## カスタムグローバル(デ)シリアライザ
27+
28+
`add_serializer``add_deserializer` を使ってクラス(デ)シリアライザを登録することで、コードベース全体でカスタム(デ)シリアライザを適用できます。
29+
30+
登録されたクラス(デ)シリアライザは pyserde のグローバル空間にスタックされ、すべての pyserde クラスで自動的に使用されます。
31+
32+
例:[isodate](https://pypi.org/project/isodate/)パッケージを使用して `datetime.timedelta` のカスタム(デ)シリアライザを実装する。
33+
34+
以下は、`datetime.timedelta` のためのクラス(デ)シリアライザを登録するコードです。
35+
このパッケージは実際に PyPI で [pyserde-timedelta](https://pypi.org/project/pyserde-timedelta/) として公開されています。
36+
37+
```python
38+
from datetime import timedelta
39+
from plum import dispatch
40+
from typing import Type, Any
41+
import isodate
42+
import serde
43+
44+
class Serializer:
45+
@dispatch
46+
def serialize(self, value: timedelta) -> Any:
47+
return isodate.duration_isoformat(value)
48+
49+
class Deserializer:
50+
@dispatch
51+
def deserialize(self, cls: Type[timedelta], value: Any) -> timedelta:
52+
return isodate.parse_duration(value)
53+
54+
def init() -> None:
55+
serde.add_serializer(Serializer())
56+
serde.add_deserializer(Deserializer())
57+
```
58+
59+
このパッケージの利用者は、 `serde_timedelta.init()` を呼び出すだけで `datetime.timedelta` のカスタム(デ)シリアライザの機能を再利用できます。
60+
61+
```python
62+
import serde_timedelta
63+
from serde import serde
64+
from serde.json import to_json, from_json
65+
from datetime import timedelta
66+
67+
serde_timedelta.init()
68+
69+
@serde
70+
class Foo:
71+
a: timedelta
72+
73+
f = Foo(timedelta(hours=10))
74+
json = to_json(f)
75+
print(json)
76+
print(from_json(Foo, json))
77+
```
78+
79+
以下のように `datetime.timedelta`ISO 8601 形式でシリアライズされます!
80+
81+
```bash
82+
{"a":"PT10H"}
83+
Foo(a=datetime.timedelta(seconds=36000))
84+
```
85+
86+
> 💡 ヒント:クラス(デ)シリアライザはいくつでも登録できます。これは、好きなだけpyserde拡張を使用できることを意味します。
87+
> 登録された(デ)シリアライザはメモリにスタックされます。
88+
>
89+
> なお、1つの(デ)シリアライザは他の(デ)シリアライザによってオーバーライドされる可能性があります。
90+
>
91+
> 例:次の順序で3つのカスタムシリアライザを登録すると、最初のシリアライザは3番目によって完全に上書きされます。2番目は異なる型用に実装されているため機能します。
92+
>
93+
> 1. `int` 用のシリアライザを登録
94+
> 2. `float` 用のシリアライザを登録
95+
> 3. `int` 用のシリアライザを登録
96+
97+
こちらは、v0.13.0 で新しく追加されました。

docs/ja/faq.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# FAQ
2+
3+
## pyserdeによって生成されたコードをどのように確認できますか?
4+
5+
pyserdeはコマンドラインとして動作する `inspect` サブモジュールを提供しています。
6+
```
7+
python -m serde.inspect <PATH_TO_FILE> <CLASS>
8+
```
9+
10+
例:pyserdeプロジェクト内で以下を実行します。
11+
12+
```
13+
cd pyserde
14+
poetry shell
15+
python -m serde.inspect examples/simple.py Foo
16+
```
17+
18+
出力
19+
```python
20+
Loading simple.Foo from examples.
21+
22+
==================================================
23+
Foo
24+
==================================================
25+
26+
--------------------------------------------------
27+
Functions generated by pyserde
28+
--------------------------------------------------
29+
def to_iter(obj, reuse_instances=True, convert_sets=False):
30+
if reuse_instances is Ellipsis:
31+
reuse_instances = True
32+
if convert_sets is Ellipsis:
33+
convert_sets = False
34+
if not is_dataclass(obj):
35+
return copy.deepcopy(obj)
36+
37+
Foo = serde_scope.types["Foo"]
38+
res = []
39+
res.append(obj.i)
40+
res.append(obj.s)
41+
res.append(obj.f)
42+
res.append(obj.b)
43+
return tuple(res)
44+
...
45+
```

docs/ja/type-check.md

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# Type Checking
2+
3+
pyserdeはv0.9からランタイム型チェックを提供しています。
4+
v0.14で完全に作り直され、[beartype](https://github.com/beartype/beartype)を使用してより洗練され信頼性の高いものとなりました。
5+
型安全で堅牢なプログラムを書くためには、型チェックを常に有効にすることを強く推奨します。
6+
7+
## `strict`
8+
9+
厳格な型チェック `strict` は、(デ)シリアライズとオブジェクト構築の際にすべてのフィールド値を宣言された型と照合します。
10+
これはv0.14以降のデフォルトの型チェックモードです。
11+
12+
このモードでは、クラス属性を指定せずに `@serde` デコレータを使用してクラスを宣言した場合、`@serde(type_check=strict)` と見なされ、厳格な型チェックが有効になります。
13+
14+
```python
15+
@serde
16+
class Foo:
17+
s: str
18+
```
19+
20+
例えば、以下のように間違った型のオブジェクトで`Foo`を呼び出すと、
21+
```python
22+
foo = Foo(10)
23+
```
24+
25+
以下のエラーが発生します。
26+
```python
27+
beartype.roar.BeartypeCallHintParamViolation: Method __main__.Foo.__init__() parameter s=10 violates type hint <class 'str'>, as int 10 not instance of str.
28+
```
29+
30+
> **注記:** 2024年2月時点でbeartypeは検証フックを提供していないため、コンストラクターからはSerdeErrorではなくbeartypeの例外が発生します。
31+
32+
同様に、間違った型のオブジェクトで(デ)シリアライズAPIを呼び出すと、
33+
34+
```python
35+
print(to_json(foo))
36+
```
37+
38+
再びエラーが発生します。
39+
40+
```python
41+
serde.compat.SerdeError: Method __main__.Foo.__init__() parameter s=10 violates type hint <class 'str'>, as int 10 not instance of str.
42+
```
43+
44+
> **注記:** beartypeによる型チェックにはいくつかの注意点があります。
45+
>
46+
> 1. beartypeは変更されたプロパティを検証できません。
47+
>
48+
> 以下のコードでは、プロパティ `s` が最後に変更されていますが、beartypeはこのケースを検出できません。
49+
> ```python
50+
> @serde
51+
> class Foo:
52+
> s: str
53+
>
54+
> f = Foo("foo")
55+
> f.s = 100
56+
> ```
57+
>
58+
> 2. beartypeはコンテナ内の各要素を検証することはできません。これはバグではなく、beartypeの設計原則です。[Does beartype actually do anything?](https://beartype.readthedocs.io/en/latest/faq/#faq-o1)を参照してください。
59+
60+
## `coerce`
61+
62+
型強制 `coerce` は、(デ)シリアライズ中に値を宣言された型に自動的に変換します。
63+
64+
```python
65+
@serde(type_check=Coerce)
66+
class Foo:
67+
s: str
68+
69+
foo = Foo(10)
70+
# pyserdeは自動的に int 値の 10 を str の "10" に変換します
71+
# {"s": "10"}が出力されます
72+
print(to_json(foo))
73+
```
74+
75+
しかし、値が宣言された型に変換できない場合(例えば、値が `foo` で型が `int` の場合)、pyserde は`SerdeError` を発生させます。
76+
77+
## `disabled`
78+
79+
これはpyserde v0.8.3およびv0.9.xまでのデフォルトの挙動です。
80+
型強制またはチェックは実行されません。
81+
82+
利用者が間違った値を入力しても、pyserdeは型の不整合を無視して処理を続行します。
83+
84+
```python
85+
@serde
86+
class Foo:
87+
s: str
88+
89+
foo = Foo(10)
90+
# pyserdeは型の整合性を確認しないため、{"s": 10} が出力されます
91+
print(to_json(foo))
92+
```

0 commit comments

Comments
 (0)