哪个更有效:Python文档字符串或类型提示?

pla*_*etp 14 python docstring type-hinting python-3.x python-jedi

我想用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."""
Run Code Online (Sandbox Code Playgroud)

记录类型的哪种方法在内存使用和运行时间方面增加了更少的开销?我首先对Python代码本身的效率感兴趣,然后是Jedi.

Dav*_*ter 13

TL; DR:使用类型注释,它们很棒.

对于Python而言,jedi使用docstrings或函数注释并没有什么不同.性能和内存影响都不应该引人注目.在这两种情况下,显然都有很小的运行时开销.

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'>}
Run Code Online (Sandbox Code Playgroud)

这些注释显然也使用了一些空间(但甚至比文档字符串还要少).但是它们对运行时执行没有影响(除非您明确使用__annotations__.

我建议你使用类型注释.由于静态分析/ IDE,它们已被引入,并且在记录您的类型时绝对是未来.还有很多工作要做mypy,jedi还有其他工具可以使类型注释在验证程序时更有用.已使用类型注释,您将为未来做好准备.

  • 虽然使用类型注释是有意义的,但它并不能解决问题。由于文档字符串对于描述参数的用途(以文字形式)仍然有意义,因此我们需要两者:用于 linter 的类型注释和用于人类的文档字符串。我不知道有任何 PEP 建议如何合并两者,因此 DRY 受到尊重,如果函数使用类型提示,我们可以在编写文档字符串时省略类型。 (4认同)