是否可以使用类型推断的 Ocaml/Haskell 算法为 Python 建议更好的自动完成?
这个想法是在以下情况下建议自动完成:
class A:
def m1(self):
pass
def m2(self):
pass
a = A()
a. <--- suggest here 'm1' and 'm2'
fun1(a)
def fun1(b):
b. <--- suggest here 'm1' and 'm2'
有什么好的起点吗?
优秀的讨论,有很多指针,在这里(有点过时)。我不相信任何“生产”编辑器会积极尝试类型推断来实现自动完成目的(但我有一段时间没有使用过例如翼件,所以他们现在可能会这样做)。
您可以查看Pharo Smalltalk中的 ECompletion 和 OCompletion 。对于 python,折衷方案可能会有所不同,但在实践中使用一些保守的类型推断进行了有根据的猜测。它还取决于您是否希望完成以替换浏览代码/文档,或帮助键入并避免拼写错误。
我认为在 Pharo 中,如果消息是显式发送到类 ( SomeClass m),那么它当然会提出该类及其超类中的所有消息。否则,它只是猜测系统中与键入的前缀匹配的所有方法名称,并且效果很好。OCompletion 添加了一些基于编辑历史的启发式优先级。
适当的处理需要 Python 的类型系统,这将是(是?)一个有趣的研究问题。
第一种情况是“简单的”,我敢打赌JetBrains 的 PyCharm可以做到这一点。我没有使用 PyCharm,但我确实使用了同样由 JetBrains 出品的 IDEA,用于基于 Groovy 的开发(一种动态语言),它具有非常好的、非常激进的自动完成功能。第二种情况会更困难,您希望 IDEfun1根据其用途推断类型。在没有泛型的语言中,这可能是合理的。但是,至少在 F#/VS2010 中(可能类似于此处的 OCaml/Haskell),编译器/IntelliSense 推断fun1具有签名'a -> 'a(即,采用泛型类型'a并返回泛型类型的函数'a),因此 IntelliSense 是很苗条。