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.
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.
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.
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".
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
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
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