PyCharm에게 어떤 유형의 매개 변수가 필요한지 어떻게 알 수 있습니까?
생성자, 할당, 메소드 호출과 관련하여 PyCharm IDE는 소스 코드를 분석하고 각 변수의 유형을 파악하는 데 매우 적합합니다. 올바른 코드 완성 및 매개 변수 정보를 제공하므로 존재하지 않는 속성에 액세스하려고하면 경고 메시지가 표시됩니다.
그러나 매개 변수에 관해서는 아무것도 모릅니다. 코드 완성 드롭 다운은 매개 변수가 어떤 유형인지 알 수 없으므로 아무 것도 표시 할 수 없습니다. 코드 분석에서 경고를 찾을 수 없습니다.
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
이것은 어느 정도 의미가 있습니다. 다른 호출 사이트는 해당 매개 변수에 대해 무엇이든 전달할 수 있습니다. 그러나 내 메소드가 매개 변수 유형을 기대하는 경우 (예 : pygame.Surface
PyCharm에 표시 할 수 있기를 원하므로 Surface
코드 완성 드롭 다운에 모든 속성을 표시하고 다음과 같은 경우 경고를 강조 표시 할 수 있습니다) 나는 잘못된 방법을 호출합니다.
PyCharm에 힌트를 줄 수있는 방법이 있습니까? "psst,이 매개 변수는 X 유형이어야합니다." (또는 아마도 동적 언어의 정신에서 "이 매개 변수는 X처럼 like 것"이라고 생각합니까?
편집 : 아래 CrazyCoder의 대답은 트릭을 수행합니다. 빠른 요약을 원하는 저와 같은 새로운 이민자에게는 다음과 같습니다.
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.
관련 부분은 @type peasant: Person
docstring 의 라인입니다.
File> Settings> Python Integrated Tools로 이동하여 "Docstring format"을 "Epytext"로 설정하면 PyCharm의 View> Quick Documentation Lookup은 모든 @ 행을 그대로 인쇄하는 대신 매개 변수 정보를 예쁘게 인쇄합니다.
예, PyCharm이 유형을 알 수 있도록 메소드 및 매개 변수에 특수 문서 형식을 사용할 수 있습니다. 최신 PyCharm 버전 은 가장 일반적인 문서 형식을 지원합니다 .
예를 들어 PyCharm은 @param style comments 에서 유형을 추출합니다 .
reStructuredText 및 docstring 규칙 (PEP 257) 도 참조하십시오 .
또 다른 옵션은 Python 3 주석입니다.
제발 PyCharm 문서 섹션을 참조하십시오 자세한 내용과 샘플.
Python 3.0 이상을 사용하는 경우 함수 및 매개 변수에 주석을 사용할 수도 있습니다. PyCharm은이를 인수 또는 반환 값에 예상되는 유형으로 해석합니다.
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
때로는 이것은 공개 문자열이 아닌 비공개 메소드에 유용합니다. 추가 혜택으로 이러한 주석은 코드로 액세스 할 수 있습니다.
>>> King.repress.__annotations__
{'peasant': <class '__main__.Person'>, 'return': <class 'bool'>}
업데이트 : Python 3.5에서 허용 된 PEP 484 에서 주석을 사용하여 인수 및 반환 유형을 지정하는 공식 규칙이기도합니다.
PyCharm은 @type pydoc 문자열에서 유형을 추출합니다. 여기 와 여기에 PyCharm 문서 및 Epydoc 문서를 참조하십시오 . PyCharm의 '레거시'섹션에 있으며 아마도 일부 기능이 부족합니다.
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.
The relevant part is the @type peasant: Person
line of the docstring.
My intention is not to steal points from CrazyCoder or the original questioner, by all means give them their points. I just thought the simple answer should be in an 'answer' slot.
I'm using PyCharm Professional 2016.1 writing py2.6-2.7 code, and I found that using reStructuredText I can express types in a more succint way:
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.
See: https://www.jetbrains.com/help/pycharm/2016.1/type-hinting-in-pycharm.html#legacy
You can also assert for a type and Pycharm will infer it:
def my_function(an_int):
assert isinstance(an_int, int)
# Pycharm now knows that an_int is of type int
pass
'Programing' 카테고리의 다른 글
Git-Windows에서 .netrc 파일을 사용하여 사용자 및 비밀번호를 저장하는 방법 (0) | 2020.05.28 |
---|---|
Ruby on Rails로 TDD를 시작하는 방법은 무엇입니까? (0) | 2020.05.28 |
pylab과 pyplot의 차이점은 무엇입니까? (0) | 2020.05.27 |
ggplot2 구문이 합리적 일 때 "전역 변수에 대한 가시적 바인딩 없음"메모를 어떻게 R CMD 검사를 처리 할 수 있습니까? (0) | 2020.05.27 |
어느 것이 가장 빠릅니까? (0) | 2020.05.27 |