2013-04-18 63 views
4

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

#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)只应该接受int但Z与从g(x)所以这是一个str。有没有什么产品可以做类似的事情?

+1

我的理解是PyPy确实有点像这样,但通常人们不会尝试去Python Python,他们只是使用严格类型的语言。另外,Python中的“编译时”实际上并不存在。您可以进行静态或动态代码分析,并且可以将pyc转换为编译,但是在基本级别上,任意代码可以在运行时更改有关系统的任何内容。 –

回答

2

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

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

+0

这正是我所期待的,谢谢! – noisecapella

+0

@noisecapella乐于帮助 –

0

我不知道这是如何比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中的每个对象的每一个方法,这将是困难的静态判断到底是什么或者fg的返回类型。我怀疑沿着这些线路的任何静态检查器都没有任何价值。

即使您向函数添加了返回类型描述符,这真的是一个保证吗?它看起来更像是可能无法与代码一起更新的文档,从而导致后来错误假设导致更加隐蔽的错误。

+2

那么当对待它时(像'__str__','__nonzero__'等等),对象的行为如何呢? Python处于鸭子式的基本水平;任何强加静态类型的尝试都会失败或破坏语言。 –

+0

标签'静态分析'意味着这并不意味着在运行时强加。 –

+0

我知道这是隐含的问题,但我认为提供正确的,习惯性的答案更重要。 –

1

我想你的遗漏关键字是decorator

您可以编写自己的装饰做的东西,如:

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

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

+0

是的,我实现了一次这样的事情。在实现这些装饰器时,一个小于酷的问题是让IDE知道你做了什么,所以代码建议可能会搞砸 - 不知道你是否在你的例子中做了它。编辑︰neah,这就是问题,如果你只是通过* args和** kwargs,代码建议会在翻译中丢失:P –