Python 编译时类型检查

noi*_*lla 5 python static-analysis pylint

Python 不会在编译时检查类型,因为它不能,至少在某些情况下是这样。但是有没有人想出一种机制来根据用户的额外注释进行编译时类型检查?像 pylint 这样的东西使用了作者的额外保证?我在想这样的事情:

#guarantee(argument=int, return_type=int)
def f(x):
    return x + 3

#guarantee(argument=int, return_type=str)
def g(x):
    return "%d times" % x

y = f(6)

# works, z = "9 times"
z = g(y)
# error
a = f(z)
Run Code Online (Sandbox Code Playgroud)

这个检查器会解释每个函数上面的注释,意识到它只f(x)应该接受int,但 z 来自g(x),所以它是一个str。有没有类似的产品?

Ian*_*sco 3

PEP 3107最近完成(最近是在去年的某个时候),它引入了变量和函数的注释。不幸的是(正如您从 pep 的数量中看到的那样)这仅适用于 Python 3.x,因此您编写的利用此功能的任何检查器(甚至代码)都将仅适用于 Python 3(这确实不是一件坏事)。

您提到 pylint,所以我假设您实际上并不希望在编译时运行检查,而是在编译后进行检查。这将是一个在代码质量邮件列表中讨论的很棒的工具。