PyCharmに、パラメーターが期待される型をどのように伝えることができますか?


173

コンストラクター、割り当て、およびメソッド呼び出しに関しては、PyCharm IDEは私のソースコードを分析し、各変数の型を理解するのに非常に適しています。コード補完とパラメータ情報が得られ、存在しない属性にアクセスしようとすると警告が表示されるので、それが正しいときに気に入っています。

しかし、パラメータに関しては何も知りません。コード補完のドロップダウンでは、パラメーターのタイプがわからないため、何も表示できません。コード分​​析は警告を探すことができません。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

peasant = Person("Dennis", 37)
# PyCharm knows that the "peasant" variable is of type Person
peasant.dig_filth()   # shows warning -- Person doesn't have a dig_filth method

class King:
    def repress(self, peasant):
        # PyCharm has no idea what type the "peasant" parameter should be
        peasant.knock_over()   # no warning even though knock_over doesn't exist

King().repress(peasant)
# Even if I call the method once with a Person instance, PyCharm doesn't
# consider that to mean that the "peasant" parameter should always be a Person

これはある程度の意味があります。他の呼び出しサイトは、そのパラメーターに何でも渡すことができます。しかし、私のメソッドがパラメータのタイプを期待している場合、たとえば、pygame.SurfacePyCharmにそれを何らかの形で示すことができるようにしたいのでSurface、コード補完ドロップダウンにすべてのの属性を表示し、間違ったメソッドを呼び出すなど。

PyCharmにヒントを与え、「psst、このパラメーターはX型であるはずです」と言う方法はありますか?(または、おそらく、動的言語の精神で、「このパラメーターはXのようにいちゃつくはずです」?私はそれで大丈夫でしょう。)


編集: CrazyCoderの答えは、以下のとおりです。簡単な要約が必要な私のような初心者のために、ここにあります:

class King:
    def repress(self, peasant):
        """
        Exploit the workers by hanging on to outdated imperialist dogma which
        perpetuates the economic and social differences in our society.

        @type peasant: Person
        @param peasant: Person to repress.
        """
        peasant.knock_over()   # Shows a warning. And there was much rejoicing.

関連する部分は@type peasant: Person、docstring の行です。

[ファイル]> [設定]> [Python統合ツール]に移動し、[Docstring形式]を[Epytext]に設定すると、PyCharmの[表示]> [クイックドキュメントルックアップ]は、@行をすべてそのまま印刷するのではなく、パラメーター情報をきれいに印刷します。


7
それはreStructuredTextのコメントがちょうど異なっ書かれた同じタグを使用することに注意すべきです:@param xx: yyyなり:param xx: yyyjetbrains.com/pycharm/webhelp/…を

1
完全修飾クラス名を指定しなくても済むのはなぜですか?
Jesvin Jose 14

回答:


85

はい、メソッドとそのパラメーターに特別なドキュメント形式を使用して、PyCharmがタイプを認識できるようにすることができます。PyCharmの最新バージョンは、最も一般的なdoc形式をサポートしています

たとえば、PyCharmは@paramスタイルのコメントから型を抽出します

reStructuredTextおよびdocstring規則(PEP 257)も参照してください。

別のオプションはPython 3アノテーションです。

詳細とサンプルについては、PyCharmのドキュメントセクション参照してください。


2
PyCharmはdoc形式を少し変更したと思いますが(jetbrains.com/help/pycharm/…を参照)、ありがとうございます!パラメータに関するインテリセンスの欠如が私を狂気に駆り立てていました。
2017年

46

Python 3.0以降を使用している場合は、関数とパラメーターにアノテーションを使用することもできます。PyCharmはこれらを引数または戻り値が持つと予想される型として解釈します:

class King:
    def repress(self, peasant: Person) -> bool:
        peasant.knock_over() # Shows a warning. And there was much rejoicing.

        return peasant.badly_hurt() # Lets say, its not known from here that this method will always return a bool

これは、docstringを必要としない非公開メソッドに役立つ場合があります。追加の利点として、これらの注釈にはコードからアクセスできます。

>>> King.repress.__annotations__
{'peasant': <class '__main__.Person'>, 'return': <class 'bool'>}

更新:Python 3.5で受け入れられたPEP 484の時点で、注釈を使用して引数と戻り値の型を指定することも公式の規則です。


4
...そしてそのようなアントネーションを使用してランタイム型チェックを実行するいくつかのパッケージがあります。これは、アサーションで同じことを行うよりも使いやすく、読みやすいので、同じように選択的に使用できます。typecheck-decoratorそのようなパッケージの1つであり、そのドキュメントに他のパッケージの概要があります。(柔軟性もあり、型チェックされたアヒルのタイピングも可能です!)
Lutz Prechelt

5

PyCharmは@type pydoc文字列から型を抽出します。こちらこちらの PyCharmドキュメント、およびEpydocドキュメントを参照してください。PyCharmの「レガシー」セクションにありますが、いくつかの機能が不足している可能性があります。

class King:
    def repress(self, peasant):
        """
        Exploit the workers by hanging on to outdated imperialist dogma which
        perpetuates the economic and social differences in our society.

        @type peasant: Person
        @param peasant: Person to repress.
        """
        peasant.knock_over()   # Shows a warning. And there was much rejoicing.

関連する部分は@type peasant: Person、docstring の行です。

私の意図は、CrazyCoderや元の質問者からポイントを盗むことではなく、必ず彼らにポイントを与えることです。私は単純な答えは「答え」スロットにあるべきだと思っただけです。


2

私はPyCharm Professional 2016.1を使用してpy2.6-2.7コードを記述していますが、reStructuredTextを使用すると、型をより簡潔に表現できることがわかりました。

class Replicant(object):
    pass


class Hunter(object):
    def retire(self, replicant):
        """ Retire the rogue or non-functional replicant.
        :param Replicant replicant: the replicant to retire.
        """
        replicant.knock_over()  # Shows a warning.

参照:https : //www.jetbrains.com/help/pycharm/2016.1/type-hinting-in-pycharm.html#legacy


1

型に対してアサートすることもでき、Pycharmはそれを推測します:

def my_function(an_int):
    assert isinstance(an_int, int)
    # Pycharm now knows that an_int is of type int
    pass
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.