私はPythonで書いたDSLの型チェッカーを書くためにPython PEP484型ヒントを使用しています。その引数の1つにタイプT
を期待する関数があり、そのタイプがS
の式で呼び出されている場合、呼び出しが有効かどうかをどのように確認できますか? issubclass(S, T)
で十分ですか?もしそうなら、なぜmypy
にそのような複雑なis_subtype
がチェックされていますか?または、ちょうどmypy
バージョンを使用する必要がありますか?タイピングモジュールを使用する際にタイプの互換性をチェックする方法は?
を編集します。ここでは、私の意図を明確にするための例です。その後
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"))
DSLは、次のように定義機能を持っています。 abc
変数の値はまだわかりませんが、リストは+
と一緒に使用できないため、TypeError
を通知してユーザーに警告します。
私がissubclass(typing.List[float], var)
を実行すると、それは私にFalseを与えます。そのため、すぐにエラーが発生する可能性があります。私の質問は、私はDSLを構築する、または私はissubclass
にどちらの引数は、このようなtyping
モジュールから構成要素を含んでいる場合mypy
私はABCを使って、ABCを期待し、サブクラスを期待しないように関数を定義しました。そして、mypyは一度も不平を言うことはありません。それはあなたのために何を言うのですか? –