我有类似以下内容:
在 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 */
首先,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 忽略,但是当你的函数执行时它会被检查。