Bagaimana saya bisa memberi tahu PyCharm tipe apa parameter yang diharapkan?

173

Ketika sampai pada konstruktor, dan penugasan, dan pemanggilan metode, PyCharm IDE cukup bagus dalam menganalisis kode sumber saya dan mencari tahu tipe apa yang harus dimiliki setiap variabel. Saya suka ketika itu benar, karena itu memberi saya penyelesaian kode dan parameter info yang baik, dan itu memberi saya peringatan jika saya mencoba mengakses atribut yang tidak ada.

Tetapi ketika datang ke parameter, ia tidak tahu apa-apa. Dropdown penyelesaian kode tidak dapat menampilkan apa pun, karena mereka tidak tahu tipe parameter apa yang akan ditampilkan. Analisis kode tidak dapat mencari peringatan.

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

Ini masuk akal. Situs panggilan lain dapat melewatkan apa pun untuk parameter itu. Tetapi jika metode saya mengharapkan parameter bertipe, katakan,, pygame.Surfacesaya ingin dapat menunjukkan hal itu kepada PyCharm, jadi itu bisa menunjukkan semua Surfaceatribut dalam dropdown penyelesaian kode, dan menyoroti peringatan jika Saya menyebut metode yang salah, dan seterusnya.

Apakah ada cara saya bisa memberi PyCharm petunjuk, dan mengatakan "psst, parameter ini seharusnya tipe X"? (Atau mungkin, dalam semangat bahasa dinamis, "parameter ini seharusnya dukun seperti X"? Aku akan baik-baik saja dengan itu.)


EDIT: Jawaban CrazyCoder, di bawah, berhasil. Untuk pendatang baru seperti saya yang menginginkan ringkasan cepat, ini dia:

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.

Bagian yang relevan adalah @type peasant: Persongaris docstring.

Jika Anda juga pergi ke File> Settings> Python Integrated Tools dan mengatur "Format Docstring" ke "Epytext", maka PyCharm's View> Quick Documentation Lookup akan mencetak informasi parameter dengan cantik, bukan hanya mencetak semua @ -baris sebagaimana adanya.

Joe White
sumber
7
Perlu dicatat bahwa komentar reStructuredText menggunakan tag yang sama hanya ditulis berbeda: @param xx: yyymenjadi :param xx: yyy. Lihat jetbrains.com/pycharm/webhelp/…
Wernight
1
Mengapa kita bisa pergi dengan tidak menentukan nama kelas yang memenuhi syarat?
Jesvin Jose

Jawaban:

85

Ya, Anda dapat menggunakan format dokumentasi khusus untuk metode dan parameternya sehingga PyCharm dapat mengetahui jenisnya. Versi PyCharm terbaru mendukung format dokumen paling umum .

Sebagai contoh, PyCharm mengekstrak tipe dari komentar gaya @param .

Lihat juga Konvensi reStructuredText dan docstring (PEP 257).

Opsi lain adalah anotasi Python 3.

Silakan merujuk ke bagian dokumentasi PyCharm untuk lebih detail dan sampel.

CrazyCoder
sumber
2
Saya pikir PyCharm sedikit mengubah format dokumennya (lihat jetbrains.com/help/pycharm/… ), tapi terima kasih! Kurangnya intellisense pada parameter membuatku gila.
Rintisan bertopik
46

Jika Anda menggunakan Python 3.0 atau yang lebih baru, Anda juga dapat menggunakan anotasi pada fungsi dan parameter. PyCharm akan menginterpretasikan ini sebagai tipe argumen atau nilai pengembalian yang diharapkan dimiliki:

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

Terkadang ini berguna untuk metode non-publik, yang tidak perlu didokumentasikan. Sebagai manfaat tambahan, anotasi tersebut dapat diakses dengan kode:

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

Pembaruan : Pada PEP 484 , yang telah diterima untuk Python 3.5, itu juga merupakan konvensi resmi untuk menentukan argumen dan mengembalikan tipe menggunakan anotasi.

Feuermurmel
sumber
4
... dan ada beberapa paket yang menggunakan penghentian tersebut untuk melakukan pemeriksaan jenis waktu-berjalan. Ini lebih nyaman digunakan dan lebih mudah dibaca daripada melakukan hal yang sama dengan pernyataan dan dapat digunakan secara selektif sama saja. typecheck-decoratoradalah salah satu paket tersebut dan memiliki ringkasan yang lain dalam dokumentasinya. (Fleksibel juga: Anda bahkan dapat melakukan pengetikan tipe bebek yang diperiksa!)
Lutz Prechelt
5

PyCharm mengekstraksi jenis dari string pydoc @type. Lihat dokumen PyCharm di sini dan di sini , dan dokumen Epydoc . Itu ada di bagian 'warisan' dari PyCharm, mungkin tidak memiliki beberapa fungsi.

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.

Bagian yang relevan adalah @type peasant: Persongaris docstring.

Tujuan saya bukan untuk mencuri poin dari CrazyCoder atau penanya semula, dengan cara apa pun memberi mereka poin mereka. Saya hanya berpikir jawaban sederhana harus di slot 'jawaban'.

makan siang
sumber
2

Saya menggunakan PyCharm Professional 2016.1 menulis kode py2.6-2.7, dan saya menemukan bahwa menggunakan reStructuredText saya dapat mengekspresikan tipe dengan cara yang lebih succint:

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.

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

pongi
sumber
1

Anda juga dapat menegaskan untuk suatu tipe dan Pycharm akan menyimpulkannya:

def my_function(an_int):
    assert isinstance(an_int, int)
    # Pycharm now knows that an_int is of type int
    pass
Alejandro Daniel Noel
sumber