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 の [ビュー] > [クイック ドキュメント ルックアップ] は、すべての @ 行をそのまま印刷するのではなく、パラメーター情報をきれいに印刷します。

4

5 に答える 5

86

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

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

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

もう1つのオプションは、Python3アノテーションです。

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

于 2011-06-11T22:31:00.897 に答える
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の時点で、注釈を使用して引数と戻り値の型を指定することも公式の規則です。

于 2012-07-22T14:31:21.933 に答える
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

于 2016-12-14T13:57:46.460 に答える
1

タイプをアサートすることもでき、Pycharm はそれを推測します。

def my_function(an_int):
    assert isinstance(an_int, int)
    # Pycharm now knows that an_int is of type int
    pass
于 2017-11-20T11:47:45.637 に答える