2017-06-06 17 views
3

JediでPythonコードに自動補完のサポートを追加したいと思います。これは、関数docstringsか型ヒント(あるいはその両方)のどちらかを使って行うことができます。どちらが効率的ですか:Pythonドキュメントストリングまたはタイプヒント?

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です。

答えて

3

TL今、決してかなりの数年間、Emacsでジェダイを使用して、私はあなたが本当に心配すべきとは思わないので、パフォーマンスの問題があってきました; 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のために導入されており、間違いなく将来になるでしょう。あなたのタイプを文書化することもあります。mypyjediなどのツールを使って、タイプの注釈をプログラムの検証に役立てることができます。タイプ注釈を使用すれば、将来の準備ができます。

1

適切な答えではありませんが、自動補完部分だけでは、ドキュメントストリングもタイプヒントも必要ありません。とにかく非常にのstdlibと3番目のパッケージには "タイプヒント"のコードはほとんどありません。

最後に

とFWIW:私は...

+0

興味深いことに、ほとんどの場合、Jediはタイプヒントや適切なドキュメントストリングを追加した後でのみ自動補完を開始します。とにかく、ジェダイの効率性だけでなく、Pythonコード自体についても質問があります。 – planetp

+1

"質問はジェダイの効率だけでなく、Pythonコード" =>であったので、質問を明確にすることができます。しかし、とにかくドキュメンタリーはAFAICTに大きな影響を与えません。タイプヒントについてはわかりませんが、それほど大きな影響はありません。 –

関連する問題