オブジェクトが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までは。
このリリースには "Experimental Support for General Recursive Types" が含まれ、これによりJSON型をmypyで扱うことができるようになりました。
0.981ではこの機能を使うために--enable-recursive-aliasesオプションを付ける必要がありましたが、0.991でdepreceatedになりデフォルトで再帰的な型定義ができるようになりました。
ちなみに再帰のサポートについてのissueはこれ(Support recursive types #731)で、closeまで7年かかっています。開発者の皆様、お疲れ様でした。