我正在使用一个庞大的现有的Python代码库,并希望开始添加types注释,所以我可以得到一定程度的静态检查。 我在想像Erlang , Strongtalk或Typed Scheme / Racket 。 我见过快速和脏的装饰器插入基于函数参数和返回types注释的dynamic检查,但我正在寻找更强大的东西,并在编译时执行检查。 现在有什么工具可用于这种事情? 我熟悉编译器和types检查,如果它有一个良好的基础,我肯定会改进一个不完整的工具。 (注意:我对静态types优劣的讨论不感兴趣。) 编辑 :一个例子: def put(d, k, v): d[k] = v 我希望能够注释put函数的types是put<K,V>(dict<K,V>, K, V) -> None 。 更新 :新的PEP 484 (2014年9月)在Python 3.5+中为静态types和types注释定义了一个标准。 有一个types检查工具称为mypy ,与PEP 484兼容。
我已经读过,Scala的types系统被Java的互操作性所削弱,因此不能像Haskell的types系统那样执行一些相同的function。 这是真的? 是因为types擦除的弱点,还是我在各方面都是错的? 这是不同的原因斯卡拉没有typeclasses?
我没有真正把注意力放在Python 3的开发上,而只是注意到了一些有趣的新的语法变化。 具体从这个SO回答函数参数注释: def digits(x:'nonnegative number') -> "yields number's digits": # … 不知道这件事情,我认为它可能被用来在Python中实现静态input! 经过一番search之后,似乎有很多关于(完全可选的)Python中的静态types的讨论,比如PEP 3107中提到的“添加可选静态types到Python” (和第2部分 ) 但是,我不清楚这个进展有多远。 有静态types的任何实现,使用参数注释? 有没有参数化types的想法使它成为Python 3?
静态types的完整Lisp变体是可能的吗? 这样的事情是否有意义存在? 我相信Lisp语言的优点之一就是其定义的简单性。 静态键入会破坏这个核心原则吗?
当我们将一种types的对象投射到另一种types时,是否有任何开销 或者编译器只是解决了一切,运行时没有成本? 这是一个普通的事情,还是有不同的情况? 例如,假设我们有一个Object []的数组,其中每个元素可能具有不同的types。 但是我们总是知道,比如说元素0是一个Double,元素1是一个String。 (我知道这是一个错误的devise,但让我们假设我必须这样做。) Java的types信息在运行时是否仍然存在? 或者编译后忘了所有的东西,如果我们做了(Double)元素[0],我们只要按照指针将这8个字节解释为一个双精度,不pipe是什么? 我很不清楚在Java中如何完成types。 如果您对书籍或文章有任何推荐,那么也要感谢。