developer tip

현재 클래스를 반환 유형 주석으로 배치

optionbox 2020. 9. 17. 07:41
반응형

현재 클래스를 반환 유형 주석으로 배치 [중복]


파이썬 3에서는 인수를 만들고 유형 주석을 반환 할 수 있습니다. 예:

class Graph:
    def __init__(self, V: int, E: int, edges: list):
        pass

    @classmethod
    def fromfile(cls, readobj: type(sys.stdin)):
        pass

    def V(self) -> int:
        pass

    def E(self) -> int:
        pass

문제는 아직 정의되지 않은 현재 클래스 (Graph)의 반환 유형으로 주석을 만들 수 없다는 것입니다. 예:

class Graph:
   def reverse(self) -> Graph:
       pass

이 코드는 오류가 있습니다.

def reverse(self) -> Graph:
NameError: name 'Graph' is not defined

이러한 주석은 IDE가 인수 및 반환 유형을 인식하도록 문서화하고 허용하는 데 모두 유용합니다. => 자동 완성 활성화

UPD : 그래서 제가 생각해 낸 것은 이것이 불가능하거나 제가 좋아하지 않는 해킹이 필요하다는 것입니다. 그래서 def reverse (self) -> 'Graph':규칙을 위반하더라도 문서에 대해 이해할 수있는 것을 사용하기로 결정했습니다 . 단점은 IDE 자동 완성에서 작동하지 않는다는 것입니다.


이제 잠시 후 내가 내린 결정 -> 'Graph'-> Graph. 내 IDE (PyCharm)가 이런 방식으로 유형을 인식 할 수 있도록 만들지는 않지만 문서화 목적으로 충분히 작동합니다.

내가 사용할 수있는 또 다른 가능한 해결책은 런타임에 주석을 변경하는 것이었지만 문서 문제를 해결하지 못합니다. 소스 중간 어딘가에서 유형 선언을 찾고 싶지 않을 것입니다.

문제는 클래스가 실제로 정의되기 전에 클래스 객체를 인식하는 데 뿌리를두고 있습니다. 파이썬에서는 불가능합니다.


python-3.7에서이 문제는 함수 정의시 주석을 평가하지 않음으로써 해결되었습니다. 대신 __annotations__문자열 형식으로 보존됩니다 . 이것을 PEP 563에 도입 된 연기 된 주석 평가 라고 합니다.

또한 참고 :

지원 중단 정책

Python 3.7부터 __future__설명 된 기능을 사용하려면 가져 오기가 필요합니다. 경고가 발생하지 않습니다.

Python 3.8에서 a PendingDeprecationWarning__future__가져 오기 없이 모듈에 유형 주석이있는 경우 컴파일러에 의해 발생합니다 .

Python 3.9부터 경고는 DeprecationWarning.

Python 4.0에서는 이것이 기본 동작이됩니다. 이 PEP와 호환되지 않는 주석 사용은 더 이상 지원되지 않습니다.

다음은 예입니다.

In [7]: from __future__ import annotations

In [8]: class C:
   ...:     def func(cls, arg:str) -> C:
   ...:         pass
   ...:     

In [9]: c = C()

참고URL : https://stackoverflow.com/questions/15853469/putting-current-class-as-return-type-annotation

반응형