programing

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

topblog 2023. 5. 3. 20:44
반응형

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

python 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가 인수를 인식하고 유형을 반환할 수 있도록 문서화하고 허용하는 데 매우 유용합니다. => 자동 완성 사용

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

python-3.7에서는 함수 정의 시간에 주석을 평가하지 않음으로써 이 문제가 해결되었습니다.은 대에신, 은보니다됩존에 됩니다.__annotations__끈 모양으로이것은 PEP 563에서 소개연기된 주석 평가라고 합니다.

참고:

사용 중지 정책

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

3에서 Python 3.8a는PendingDeprecationWarning에 형식 주석이 하는 상태에서 을 러 사 지 하 않 키 고 웁 니 다 컴 용 모 파 듈 서 모__future__수입품.

3가 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()

그래서 잠시 후에 저는 제가 내린 결정이-> 'Graph'-> GraphIDE(PyCharm)가 이런 방식으로 유형을 인식할 수는 없지만 문서화 목적으로 충분히 작동합니다.

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

이 문제는 클래스가 실제로 정의되기 전에 클래스 개체를 인식하는 데 있습니다.파이썬에서 그것은 단순히 불가능합니다.

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

반응형