PyCharm での type hinting を使いこなす

  • 92
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

PyCharm を使うと、 docstring のコメントを元に型推論してくれます。

def foo(x):
    """
    :rtype: list of str
    """
    return x

def bar(x):
    a = foo(x)
    a[0].  # <- この時点で文字列のメソッドが候補になる

docstring

Sphinx の書き方と Epytext の書き方を受け付けるようですが、 Python では Sphinx の方が一般的なのでそれに習いましょう。

def repeat(x, y):
    """
    :param str x: value to repeat
    :type  y: int
    :param y: number of repeat
    :rtype:   str
    :return:  repeated string
    """
    return x * y

引数は :param 型 名前: という書き方でもいいですし、 :type 引数名: 型 という書き方もできます。
戻り値は :rtype: で書きましょう。

型宣言

StdlibTypes2.properties というファイルをみると書き方が大体わかります。このファイルは Mac だと /Applications/PyCharm 2.7.2 EAP.app/helpers というディレクトリにあります。

いくつか抜粋してみます。

__builtin__.locals = \
  :rtype: dict of (string, unknown)

__builtin__.filter = \
  :type function_or_none: collections.Callable or None \n\
  :type sequence: collections.Iterable of T \n\
  :rtype: list of T \n\

__builtin__.enumerate.__init__ = \
  :type iterable: collections.Iterable of T \n\
  :type start: int or long \n\
  :rtype: enumerate of (int, T) \n\

__builtin__.enumerate.next = \
  :rtype: (int, T) \n\

__builtin__.dict.__init__ = \
  :type seq: collections.Iterable of (T, V) \n\
  :rtype: dict of (T, V) \n\

__builtin__.dict.__getitem__ = \
  :type y: T \n\
  :rtype: V \n\

__builtin__.dict.items = \
  :rtype: list of (T, V) \n\

複合型は、タプルの場合のみ (int, str) のような書き方ができて、それ以外の場合は dict of (T, V) のように of を使って表すようです。

型引数は T だけじゃなくて任意の大文字一文字が使えそうです。

一般的な型を返す時は collections にある ABC を of T の形で使えばよさそうです。

複数の方を受け取れる場合は、 int or None の用に or でつなげるようです。

その他の変数への type hinting

#: :type: int
x = unknown()

のようにコメントをつけると hinting できます。でも、

#: ????
a, b = unknwon()

この場合にどうやって hinting すればいいのかまだ判りません。
一回タプルで受け取ることもできますが、不恰好なので、関数側にちゃんと :rtype: を定義するのがよさそうです。