我希望使用Jedi为我的Python代码添加一些自动完成支持。这可以通过使用函数docstrings或类型提示(或两者)来完成。
def function_with_types_in_docstring(param1, param2):
"""Example function with types documented in the docstring.
:type param1: int
:type param2: str
:rtype: bool
"""
def function_with_pep484_type_annotations(param1: int, param2: str) -> bool:
"""Example function with PEP 484 type annotations."""
记录类型的哪种方法在内存使用和运行时方面增加了更少的开销?我首先对Python代码本身的效率感兴趣,然后是Jedi。
答案 0 :(得分:10)
TL; DR:使用类型注释,它们很棒。
对于Python和jedi
,使用docstrings或函数注释时没有任何区别。性能和内存影响都不应该引人注目。在这两种情况下,显然都有很小的运行时开销。
文档字符串只是转换为Python字符串并存储在属性function.__doc__
中。这需要几个字节的内存,但你不应该关心它。一个1000字符的非常大的文档字符串仍然只使用1kB的RAM。如果你的记忆受到限制,你可以简单地使用python -o
来摆脱文档字符串(并断言,查找它)。
输入注释(PEP 484,例如def foo(a: int) -> str:
)存储在function.__annotations__
中:
>>> def foo(bar: int): pass
...
>>> foo.__annotations__
{'bar': <class 'int'>}
这些注释显然也使用了一些空间(但甚至比文档字符串还要少)。但是它们对运行时执行没有影响(除非您明确使用__annotations__
。
我建议你使用类型注释。由于静态分析/ IDE,它们已被引入,并且在记录您的类型时绝对是未来。还有很多工作在mypy
,jedi
以及其他工具上进行,以使类型注释在验证程序时更有用。已使用类型注释,您将为未来做好准备。
答案 1 :(得分:1)
不是一个正确的答案,但仅对于自动完成部分,既不需要文档字符串也不需要类型提示。另请注意,无论如何,您都会在stdlib和第三部分包中找到非常非常的“类型提示”代码。
最后和FWIW:我已经在Emacs中使用Jedi已经有好几年了,从来没有出现性能问题所以我认为你不应该真的担心...