2016-06-20 8 views
3

私は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

+0

私はABCを使って、ABCを期待し、サブクラスを期待しないように関数を定義しました。そして、mypyは一度も不平を言うことはありません。それはあなたのために何を言うのですか? –

答えて

0

issubclassチェックが十分であるように、より複雑なチェックを使用する必要がある場合は、このチェックは、ケース全体に動作することが保証されているかどうかでありますなどUnionCallableAny、ジェネリック医薬品、

typing構築物が彼らの真の姿の影としてPythonランタイムに存在するように、それは彼らが、概念的意味をなす操作の多くをサポートしていないです。

issubclass(List[int], List[int]) # runtimem error 
issubclass(List[int], List) # True (as expected) 
issubclass(str, Union[str]) # runtime error 
issubclass(Union[str], str) # True (as expected) 
issubclass(Union[int, str], str) # runtime error 

時々issubclasstypingのコンストラクトで動作しますが、一般的には例外が発生したり、誤った回答が返されることがあります。あなたはケースバイケースで何をすべきかを理解する必要があります。

mypyは、すべてのtyping構造を処理する必要があるため、さらに複雑なis_subtypeを持っています。

関連する問題