2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JSONに変換可能かどうかをmypyで判定する

Last updated at Posted at 2023-02-06

オブジェクトがJSONに変換可能かどうかをmypyで判定したくなったことはありませんか?僕はあります。例えば、floatと間違えてnumpy.ndarrayをJSONに変換してエラーになったことがあります。

>>> a = np.asarray([0])
>>> json.dumps(a)
Traceback (most recent call last):

TypeError: Object of type ndarray is not JSON serializable

こういうエラーは型で防ぎたいですが、mypyでは長らく実現不可能でした。JSONに変換可能かどうかを型で定義しようとすると再帰が出てきてしまうためです。

JSON = Union[Dict[str, "JSON"], List["JSON"], Tuple["JSON", ...], str, int, float, bool, None]

再帰は(一部の例外を除き)mypyでサポートされていませんでした。mypy 0.981までは。

Mypy 0.981 Released

このリリースには "Experimental Support for General Recursive Types" が含まれ、これによりJSON型をmypyで扱うことができるようになりました。

0.981ではこの機能を使うために--enable-recursive-aliasesオプションを付ける必要がありましたが、0.991でdepreceatedになりデフォルトで再帰的な型定義ができるようになりました。

ちなみに再帰のサポートについてのissueはこれ(Support recursive types #731)で、closeまで7年かかっています。開発者の皆様、お疲れ様でした。

2
0
1

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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?