0

次のようなものがあります。

myfile.py で:

from file1 import REQ
@has_request_variable
def fun(request, REQ(validator=check_int))
   /* body */

file1.py で

class REQ(object):
    def __init__(self, validator=None):
        self.validator = validator

def has_request_variables(view_func):
       /* body */
       # Below I am calling the validator function to check
       error = param.validator(var_name, val)

mypy を使用して楽しい関数に注釈を付けたいと思います。次の方法で実行しましたが、うまくいきましたが、理想的ではありません。楽しみのように、メッセージは int 型であることがわかっているので、int のようなもので引数に注釈を付ける必要があります... mypy を使用してどのように達成できますか。

from file1 import REQ
@has_request_variable
def fun(request, message=REQ(validator=check_int))
    # type(Any, REQ) -> Any
    msg = message # type: int
   /* body */
4

1 に答える 1

0

まず、mypy は型注釈とは直接関係ありません。mypy は型推論 (存在する場合は型注釈) を使用してコードの型をチェックするプログラムであるため、コードに注釈を付けなくても mypy を使用できます。また、ドキュメントやコードの読みやすさなど、多くの便利な目的で、mypy なしで型注釈を使用できます。

次に、mypy は静的型チェッカーです。型がチェックされているため、プログラムは実行されていないため、mypy で実行時の型チェックを行う意味はありません (これは、質問のコードに見られるようなものです)。

したがって、静的な型チェックが必要な場合は、注釈を使用してください。ただし、実行時に型チェックが必要な場合は、assertionsなどを使用できます。それとも両方使える...

型注釈 (mypy による静的型チェック用):

PEPによると、型注釈を使用すると、次のコードから抜け出すことができます。

def print_many(what, how_many=10):
    long_what = how_many * what
    print(long_what)

これには、関数パラメーター、戻り値の型、および注釈が付けられたローカル変数があります。

def print_many(what: str, how_many: int=10) -> None:
    long_what = how_many * what # type: str
    print(long_what)

あなたの特定のユースケースでは、それmessageが typeであることがわかっている場合は、次のようになります。intdef fun(request, message: int)

注釈付きのコードで mypy を実行して結果を取得することはできますが、コードは型チェックされるだけで実行されません。REQ(validator=check_int)そのため、 mypy では完全に無視されるなどのパラメータのデフォルト値が使用されます。

PEP 0484 とtypingモジュールが Python 3.5 の公式の一部である場合でも、mypy は別のプロジェクトであり、多くの場合、すでにかなりうまく機能していますが、まだ開発中であることに注意してください。

実行時の型チェックのためのアサーション:

def fun(request, message: int):
    assert isinstance(message, int)
    # function body

このようなアサーションは mypy によって無視されますが、関数の実行時にチェックされます。

于 2016-05-07T16:24:51.477 に答える