mypy 使用装饰器进行类型检查

问题描述 投票:0回答:1

我有类似以下内容:

在 myfile.py 中:

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

在文件1.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 注释 fun 函数,我已经按照以下方式完成了并且它有效,但它并不理想,正如我知道的 fun 一样 message 是 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 */
python python-2.7 python-typing mypy
1个回答
0
投票

首先,mypy 与类型注释没有直接关系。您可以在不注释代码的情况下使用 mypy,因为 mypy 是一个使用类型推断(和类型注释,如果存在)来对代码进行类型检查的程序。此外,您可以在不使用 mypy 的情况下使用类型注释 - 用于许多有用的目的,例如文档、代码可读性等。

其次,mypy 是一个静态类型检查器。在检查类型时,您的程序没有运行,因此尝试使用 mypy 进行运行时类型检查是没有意义的(这就是我在问题中的代码中看到的内容)。

因此,如果您想要静态类型检查,请使用注释。但是,如果您想在运行时进行类型检查,您可以例如使用断言。或者您可以同时使用它们...

类型注释(用于使用 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
属于
int
类型,那么:
def 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 忽略,但是当你的函数执行时它会被检查。

© www.soinside.com 2019 - 2024. All rights reserved.