PyCharm에게 어떤 유형의 매개 변수가 필요한지 어떻게 알 수 있습니까?


173

생성자, 할당, 메소드 호출과 관련하여 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.SurfacePyCharm에 표시 할 수 있기를 원하므로 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: Persondocstring 의 라인입니다.

File> Settings> Python Integrated Tools로 이동하여 "Docstring format"을 "Epytext"로 설정하면 PyCharm의 View> Quick Documentation Lookup은 모든 @ 행을 그대로 인쇄하는 대신 매개 변수 정보를 예쁘게 인쇄합니다.


7
그것은 reStructuredText 주석 그냥 다르게 작성된 동일한 태그를 사용하는 것에주의해야 다음과 같습니다 @param xx: yyy된다 :param xx: yyy. jetbrains.com/pycharm/webhelp/…
Wernight April

1
정규화 된 클래스 이름을 지정하지 않아도되는 이유는 무엇입니까?
Jesvin Jose

답변:


85

예, PyCharm이 유형을 알 수 있도록 메소드 및 매개 변수에 특수 문서 형식을 사용할 수 있습니다. 최신 PyCharm 버전 은 가장 일반적인 문서 형식을 지원합니다 .

예를 들어 PyCharm은 @param style comments 에서 유형을 추출합니다 .

reStructuredTextdocstring 규칙 (PEP 257) 도 참조하십시오 .

또 다른 옵션은 Python 3 주석입니다.

제발 PyCharm 문서 섹션을 참조하십시오 자세한 내용과 샘플.


2
PyCharm이 문서 형식을 약간 변경했다고 생각 하지만 ( jetbrains.com/help/pycharm/… 참조 ) 감사합니다! 매개 변수에 대한 인텔리전스가 부족하여 나를 미치게했습니다.
스텁

46

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 부터 주석을 사용하여 인수 및 반환 유형을 지정하는 공식 규칙이기도합니다.


4
... 그리고 이러한 주석을 사용하여 런타임 유형 검사를 수행하는 여러 패키지가 있습니다. 이것은 어설 션으로 동일한 작업을 수행하는 것보다 사용하기 쉽고 읽기가 더 쉽고 선택적으로 동일하게 사용할 수 있습니다. typecheck-decorator그러한 패키지 중 하나이며 설명서에 다른 패키지가 요약되어 있습니다. (유연성 : 유형 확인 오리 타이핑도 가능합니다!)
Lutz Prechelt

5

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.

관련 부분은 @type peasant: Persondocstring 의 라인입니다.

내 의도는 CrazyCoder 또는 원래 질문자의 포인트를 훔치는 것이 아니며, 반드시 포인트를 제공하는 것입니다. 방금 간단한 답변이 '답변'슬롯에 있어야한다고 생각했습니다.


2

py2.6-2.7 코드를 작성하는 PyCharm Professional 2016.1을 사용하고 있으며 reStructuredText를 사용하면 더 간결한 방식으로 유형을 표현할 수 있음을 발견했습니다.

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.

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


1

유형을 주장 할 수 있으며 Pycharm이이를 유추합니다.

def my_function(an_int):
    assert isinstance(an_int, int)
    # Pycharm now knows that an_int is of type int
    pass
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.