我正在使用大量现有的Python代码库,并希望开始添加类型注释,以便我可以进行一定程度的静态检查.我想象的是Erlang,Strongtalk或Typed Scheme/Racket.
我见过快速和脏的装饰器,它们根据函数参数和返回类型注释插入动态检查,但我正在寻找更强大的东西并在编译时执行检查.
现在有哪些工具可用于此类事情?我熟悉编译器和类型检查,如果它具有良好的基础,我绝对愿意改进一个不完整的工具.
(注意:我对讨论静态类型的优缺点不感兴趣.)
编辑:一个例子:
def put(d, k, v):
d[k] = v
Run Code Online (Sandbox Code Playgroud)
我希望能够将put函数注释为具有类型put<K,V>(dict<K,V>, K, V) -> None.
更新:新的PEP 484(2014年9月)定义了Python 3.5+中静态类型和类型注释的标准.有一个名为mypy的类型检查工具,它与PEP 484兼容.
我正在尝试编写一个调用serde_json::to_writer两次的函数来写两件事,但我不知道怎么做。
这是一次尝试(游乐场链接):
extern crate serde_json;
fn main() {
let mut out = std::fs::File::create("out.txt").unwrap();
write_stuff(&mut out);
}
fn write_stuff<W: ?Sized>(out: &mut W) -> Result<(), std::io::Error>
where
W: std::io::Write,
{
serde_json::to_writer(out, &1).unwrap(); // `out`: value moved here
serde_json::to_writer(out, &2).unwrap(); // `out`: value used here after move
Ok(())
}
Run Code Online (Sandbox Code Playgroud)
编辑:想出了一种方法来编译东西,但有没有更简单的方法(游乐场链接):
extern crate serde_json;
fn main() {
let mut out = std::fs::File::create("out.txt").unwrap();
write_stuff(&mut out);
}
fn write_stuff<W: ?Sized>(out: &mut W)
where
W: std::io::Write,
{
write_wrapper(out);
write_wrapper(out);
} …Run Code Online (Sandbox Code Playgroud)