Python编译时类型检查

2024-06-23 19:47:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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)

这个检查器将解释每个函数上面的注释,认识到f(x)只接受{},而z来自{},所以它是str。有没有类似的产品?在


Tags: 用户类型returndeftype情况作者argument
3条回答

PEP 3107最近完成了(最近是在去年的某个时候),它引入了变量和函数的注释。不幸的是(从pep的数量可以看出),这只适用于python3.x,所以您编写的任何检查器(甚至代码)都只能使用python3(这不是一件坏事)。在

您提到pylint,所以我假设您实际上并不希望在编译时运行检查,而是在编译之后进行检查。这将是在code-quality mailing list上讨论的一个很棒的工具。在

我想你缺少的关键字是^{}。在

您可以编写自己的装饰器来执行以下操作:

@check(bar=int)
foo(bar):
    pass

您可以看到一个示例实现here。当然,这对于编译检查无效,因为它是在运行时完成的。在

我不确定这对Python中现有的运行时机制有何重大改进。例如

def f(x):
    if not isinstance(x, int):
        raise TypeError("Expected integer")
    return x + 3

def g(x):
    return "%d times" % x

# Works.
y = f(6)
z = g(y)
# Fails, raises TypeError.
a = f(z)

换句话说,如果不注释Python中每个对象的每个函数和每个方法,就很难静态地确定f或{}的返回类型是什么。任何静态值我都会怀疑。在

即使您在函数中添加了返回类型描述符,这真的是一种保证吗?它看起来更像是文档,可能无法随代码一起更新,这会导致以后由于不正确的假设而导致更为隐蔽的错误。在

相关问题 更多 >

    热门问题