Python PEP484 型ヒントを使用して、Python で作成した DSL の型チェッカーを作成しています。T
引数の 1 つにtype を期待する関数があり、それが type の式で呼び出されているS
場合、呼び出しが有効かどうかを確認するにはどうすればよいですか? 使用量はissubclass(S, T)
足りていますか?もしそうなら、なぜそのmypy
ような複雑なis_subtype
チェックがあるのですか? それとも、そのままのmypy
バージョンを使用する必要がありますか?
編集:これは、私が何を意味するかを明確にするための例です。DSL には、次のように定義された関数があります。
T = TypeVar('T', float, str)
def op_add(operand1: T, operand2: T) -> T:
"Number addition or string concatenation."
# In this DSL, `+` cannot be used with lists
return operand1 + operand2 # Rely on Python overloading of `+`
次に、ユーザーが構文ツリーに解析される式を入力します。分岐は次のようになりますnode = OperatorNode('+', Literal([5.0]), Variable("abc"))
。変数の値はまだわかりませんabc
が、リストは では使用できないため、ユーザーに警告+
するために a を発生させたいと考えています。TypeError
もしそうならissubclass(typing.List[float], var)
、それは私に False を与えるので、すぐにエラーを発生させることができます. 私の質問は、DSL を構築するときにこのチェックがケース全体で機能することが保証されているかどうか、または次のようなより複雑なチェックを使用する必要があるかどうかです。mypy