Jak mogę powiedzieć PyCharm, jakiego typu ma być parametr?

Jeśli chodzi o konstruktory, przypisania i wywołania metod, PyCharm IDE jest całkiem dobry w analizowaniu mojego kodu źródłowego i zastanawianiu się, jaki typ powinna być każda zmienna. Lubię to, gdy jest właściwe, ponieważ daje mi dobre zakończenie kodu i informacje o parametrach, i daje mi ostrzeżenia, jeśli próbuję uzyskać dostęp do atrybutu, który nie istnieje.

Ale jeśli chodzi o parametry, to nic nie wie. Listy rozwijane uzupełniania kodu nie mogą niczego pokazać, ponieważ nie wiedzą, jakiego typu parametr będzie. Analiza kodu nie może szukać ostrzeżeń.
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
To ma pewien sens. Inne strony połączeń mogą przekazać cokolwiek dla tego parametru. Ale jeśli moja metoda oczekuje, że parametr będzie typu, powiedzmy, pygame.Surface, chciałbym być w stanie wskazać to PyCharm w jakiś sposób, aby mógł pokazać mi wszystkie atrybuty Surface w rozwijanej liście zakończeń kodu i wyróżnić ostrzeżenia, jeśli wywołam złą metodę, i tak dalej.

Czy Jest jakiś sposób na podpowiedź PyCharm i powiedz "psst, ten parametr ma być typu X"? (A może, w duchu języków dynamicznych, "ten parametr ma kwakać jak X"? Nie przeszkadza mi to.)


EDIT: odpowiedź Crazycodera, poniżej, robi sztuczkę. Dla wszystkich nowicjuszy, takich jak ja, którzy chcą szybkiego podsumowania, oto jest: {]}

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.

Odpowiednią częścią jest @type peasant: Person linia docstringu.

Jeśli również przejdź do File > Settings > Python Integrated Tools i ustaw "Docstring format" na "Epytext", a następnie PyCharm ' s View > Quick Documentation Lookup będzie pretty-drukuje informacje o parametrach zamiast tylko drukować wszystkie linie @tak, jak jest.

Author: Mr_and_Mrs_D, 2011-06-12

5 answers

Tak, możesz użyć specjalnego formatu dokumentacji dla metod i ich parametrów, aby PyCharm mógł znać typ. Najnowsza wersja PyCharm obsługuje większość popularnych formatów doc .

Na przykład, PyCharm wyodrębnia typy z @param style komentarzy .

Zobacz także reStructuredText i konwencje docstring (PEP 257).

Inną opcją są adnotacje Pythona 3.

Proszę zapoznać się z sekcją dokumentacji PyCharm dla więcej szczegółów i próbek.

 79
Author: CrazyCoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-07 15:25:52

Jeśli używasz Pythona 3.0 lub nowszego, możesz również używać adnotacji dotyczących funkcji i parametrów. PyCharm zinterpretuje je jako typ, jaki powinny mieć argumenty lub wartości zwrotne:

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

Czasami jest to przydatne dla metod niepublicznych, które nie potrzebują docstringu. Jako dodatkową korzyść, do tych adnotacji można uzyskać dostęp za pomocą kodu:

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

Update: od PEP 484 , który został zaakceptowany dla Pythona 3.5, jest również oficjalną konwencją do określ typy argumentów i zwrotów za pomocą adnotacji.

 45
Author: Feuermurmel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-06 13:14:27

PyCharm wyodrębnia typy z łańcucha @ type pydoc. Zobacz PyCharm docstutaj itutaj iepydoc docs . Jest w sekcji "dziedzictwo" PyCharm, być może brakuje mu jakiejś funkcjonalności.

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.

Odpowiednią częścią jest @type peasant: Person linia docstringu.

Moim zamiarem nie jest kradzież punktów z CrazyCoder lub oryginalnego pytającego, za wszelką cenę dać im swoje punkty. Po prostu pomyślałem, że prosta odpowiedź powinna być w miejscu "odpowiedzi".

 3
Author: dfrankow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-28 18:25:03

Używam PyCharm Professional 2016.1 pisząc kod py2. 6-2. 7 i odkryłem, że używając reStructuredText mogę wyrażać typy w bardziej zwięzły sposób:

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.

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

 1
Author: pongi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-14 13:57:46

Można również twierdzić dla typu i Pycharm wywnioskuje to:

def my_function(an_int):
    assert isinstance(an_int, int)
    # Pycharm now knows that an_int is of type int
    pass
 1
Author: Alejandro Daniel Noel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-20 11:47:45