Jeśli chodzi o konstruktory, przypisania i wywołania metod, IDE PyCharm jest całkiem niezłe w analizowaniu mojego kodu źródłowego i określaniu, jakiego typu powinna być każda zmienna. Podoba mi się, gdy jest to poprawne, ponieważ zapewnia mi dobre uzupełnienie kodu i informacje o parametrach oraz ostrzega mnie, gdy 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ą nic pokazać, ponieważ nie wiedzą, jakiego typu będzie parametr. 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
Ma to pewien sens. Inne strony wywołujące mogą przekazać cokolwiek dla tego parametru. Ale jeśli moja metoda oczekuje, że parametr będzie typu, powiedzmy, pygame.Surface
chciałbym móc w jakiś sposób wskazać to PyCharm, aby mógł pokazać mi wszystkie Surface
atrybuty w rozwijanym menu uzupełniania kodu i podświetlić ostrzeżenia, jeśli Nazywam niewłaściwą metodę i tak dalej.
Czy istnieje sposób, w jaki mogę dać PyCharm wskazówkę i powiedzieć „psst, ten parametr powinien być typu X”? (A może, w duchu języków dynamicznych, „ten parametr ma kwakać jak X”? Nie przeszkadza mi to.)
EDYCJA: odpowiedź CrazyCodera poniżej załatwia sprawę. Dla każdego nowicjusza takiego jak ja, który chce 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 dokumentu.
Jeśli również przejdziesz do Plik> Ustawienia> Zintegrowane narzędzia Python i ustawisz „Docstring format” na „Epytext”, wówczas Widok PyCharm> Szybkie wyszukiwanie dokumentacji wypisze informacje o parametrach, zamiast po prostu wydrukować wszystkie @ -lines w stanie, w jakim się znajdują.
źródło
@param xx: yyy
staje się:param xx: yyy
. Zobacz jetbrains.com/pycharm/webhelp/…Odpowiedzi:
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 dokumentów .
Na przykład PyCharm wyodrębnia typy z komentarzy w stylu @param .
Zobacz także konwencje reStructuredText i docstring (PEP 257).
Inną opcją są adnotacje w Pythonie 3.
Więcej informacji i próbek można znaleźć w sekcji dokumentacji PyCharm .
źródło
Jeśli używasz języka Python 3.0 lub nowszego, możesz również używać adnotacji do funkcji i parametrów. PyCharm zinterpretuje je jako typ, którego argumenty lub wartości zwracane powinny mieć:
Czasami jest to przydatne w przypadku metod niepublicznych, które nie wymagają dokumentacji. Dodatkową korzyścią jest to, że dostęp do adnotacji można uzyskać za pomocą kodu:
Aktualizacja : od PEP 484 , który został zaakceptowany dla Pythona 3.5, oficjalną konwencją jest również określanie argumentów i typów zwracanych za pomocą adnotacji.
źródło
typecheck-decorator
jest jednym z takich pakietów i ma podsumowanie innych w swojej dokumentacji. (Elastyczne też: możesz nawet pisać kaczkę z zaznaczoną czcionką!)PyCharm wyodrębnia typy z ciągu znaków pydoc @type. Zobacz dokumentację PyCharm tutaj i tutaj oraz dokumentację Epydoc . Znajduje się w sekcji „dziedzictwo” PyCharm, być może brakuje mu jakiejś funkcjonalności.
Odpowiednią częścią jest
@type peasant: Person
linia dokumentu.Moim zamiarem nie jest kradzież punktów od CrazyCodera lub oryginalnego pytającego, z całą pewnością dawaj im ich punkty. Pomyślałem, że prosta odpowiedź powinna znajdować się w polu „odpowiedź”.
źródło
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:
Zobacz: https://www.jetbrains.com/help/pycharm/2016.1/type-hinting-in-pycharm.html#legacy
źródło
Możesz również potwierdzić typ, a Pycharm to wywnioskuje:
źródło