PyCharm'a ne tür bir parametrenin olması gerektiğini nasıl anlayabilirim?


173

Yapıcılar, atamalar ve yöntem çağrıları söz konusu olduğunda, PyCharm IDE kaynak kodumu analiz etme ve her bir değişkenin ne tür olması gerektiğini bulma konusunda oldukça iyidir. Doğru olduğunda seviyorum, çünkü bana iyi bir kod tamamlama ve parametre bilgisi veriyor ve var olmayan bir özniteliğe erişmeye çalışırsam bana uyarı veriyor.

Ancak, parametreler söz konusu olduğunda, hiçbir şey bilmez. Kod tamamlama açılır listeleri hiçbir şey gösteremez, çünkü parametrenin ne tür olacağını bilmezler. Kod analizi uyarı arayamaz.

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

Bu belli bir anlam ifade ediyor. Diğer çağrı siteleri bu parametre için her şeyi iletebilir. Ancak benim yöntemim bir parametre türünü pygame.Surfacebeklerse, diyelim ki, bunu bir şekilde PyCharm'a gösterebilmek istiyorum, bu yüzden bana tüm Surfacekod özelliklerini tamamlama açılır listesinde gösterebilir ve uyarıları vurgulayın Yanlış yöntemi çağırıyorum vb.

PyCharm'a bir ipucu vermenin ve "psst, bu parametrenin X tipi olması gerekiyor" diyebilmemin bir yolu var mı? (Ya da, belki de dinamik diller ruhu içinde, "bu parametrenin X gibi quack yapması gerekiyor"? Bununla iyi olur.)


EDIT: CrazyCoder yanıt, aşağıda, hile yapar. Hızlı özet isteyen benim gibi yeni gelenler için işte burada:

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.

İlgili bölüm @type peasant: Persondoktora çizgisidir.

Ayrıca Dosya> Ayarlar> Python Entegre Araçları'na gidip "Doküman Biçimi" ni "Epytext" olarak ayarlarsanız, PyCharm'ın Görünümü> Hızlı Doküman Arama, tüm @ satırlarını olduğu gibi yazdırmak yerine parametre bilgilerini güzel bir şekilde yazdırır.


7
ReStructuredText yorumunun sadece farklı yazılmış aynı etiketleri kullandığına dikkat edilmelidir: @param xx: yyyolur :param xx: yyy. Bkz. Jetbrains.com/pycharm/webhelp/…
Wernight

1
Tam nitelikli sınıf adı belirtmemekle neden kaçabiliriz?
Jesvin Jose

Yanıtlar:


85

Evet, PyCharm'ın türü bilmesi için yöntemler ve parametreleri için özel belge biçimini kullanabilirsiniz. Son PyCharm sürümü en yaygın doküman formatlarını destekler .

Örneğin, PyCharm @param tarzı yorumlardan türleri ayıklar .

Ayrıca bkz. ReStructuredText ve doktora kuralları (PEP 257).

Başka bir seçenek de Python 3 ek açıklamalarıdır.

Daha fazla ayrıntı ve örnek için lütfen PyCharm belgeleri bölümüne bakın .


2
PyCharm'ın doc biçimini biraz değiştirdiğini düşünüyorum (bkz. Jetbrains.com/help/pycharm/… ), ama teşekkürler! Parametrelerdeki bilgisizlik beni deli ediyordu.
koçanları

46

Python 3.0 veya üstünü kullanıyorsanız, işlevler ve parametreler hakkında ek açıklamalar da kullanabilirsiniz. PyCharm bunları argümanların veya dönüş değerlerinin olması beklenen tür olarak yorumlar:

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

Bazen bu, bir doktora ihtiyacı olmayan halka açık olmayan yöntemler için yararlıdır. Ek bir avantaj olarak, bu ek açıklamalara kodla erişilebilir:

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

Güncelleme : Python 3.5 için kabul edilen PEP 484'ten itibaren , açıklamaları kullanarak argüman ve dönüş türlerini belirlemek de resmi sözleşmedir.


4
... ve çalışma zamanı tür denetimi yapmak için bu tür değişikliklerin kullanıldığı birkaç paket vardır. Bu, hem iddialarla aynı şeyi yapmaktan hem kullanımı daha kolay ve okunması daha kolaydır ve seçici olarak aynı şekilde kullanılabilir. typecheck-decoratorböyle bir pakettir ve belgelerinde diğerlerinin bir özeti vardır. (Esnek, ayrıca: tip kontrollü ördek yazımı bile yapabilirsiniz!)
Lutz Prechelt 20:14

5

PyCharm, @type pydoc dizesinden türleri ayıklar. Pycharm dokümanlar bakın burada ve burada , ve Epydoc belgeler . PyCharm'ın 'eski' bölümünde, belki de bazı işlevlerden yoksundur.

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.

İlgili bölüm @type peasant: Persondoktora çizgisidir.

Niyetim, CrazyCoder'den ya da asıl sorgulayıcıdan puan çalmak değil, elbette onlara puan vermek. Basit cevabın bir 'cevap' yuvasında olması gerektiğini düşündüm.


2

PyCharm Professional 2016.1 py2.6-2.7 kodu yazma kullanıyorum ve reStructuredText kullanarak ben daha özlü bir şekilde türleri ifade edebilirsiniz bulundu:

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.

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


1

Ayrıca bir tür için iddia edebilirsiniz ve Pycharm bunu çıkarır:

def my_function(an_int):
    assert isinstance(an_int, int)
    # Pycharm now knows that an_int is of type int
    pass
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.