ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • python @runtime_checkable이란? (openai 개발자들이 짠 python code 예시 함께 살펴보기)
    python 2024. 2. 24. 14:38

    python 3.8부터 도입된 @runtime_checkable 데코레이터를 사용하면 프로토콜 클래스를 런타임에서 isinstance()issubclass() 함수와 함께 사용할 수 있게 됩니다. 프로토콜 클래스란 typing.Protocol을 상속받은 클래스를 말합니다.
    runtime_checkable은 같은 클래스를 상속받진 않았지만, 런타임에서 타이핑 검증을 하고 싶을 경우 유용하게 쓸 수 있는 데코레이터입니다.

     

     

    말로 하면 이해가 잘 안되니 코드로 설명해보겠습니다.

     

    1. @runtime_checkable를 사용하지 않은 경우

    우선 @runtime_checkable를 사용하지 않은 일반적인 상황입니다.

     

    JsonSerializable, Person 두 클래스 모두 아무것도 상속받지 않은 순수 클래스입니다.line 13에서 Person의 인스턴스를 생성하고 (my_person), isinstance로 my_person이 JsonSerializable의 인스턴스인지 검사하면 당연히 False가 나옵니다.

     

     

     

    2. @runtime_checkable를 사용한 경우

    다음은 @runtime_checkable를 사용한 경우입니다.

     

    JsonSerializable는 typing.Protocol을 상속받았고, Person은 동일합니다.

    line 13에서 Person의 인스턴스를 생성하고 (my_person), isinstance로 my_person이 JsonSerializable의 인스턴스인지 검사하면 True가 나옵니다.  직접 상속받진 않았지만, 프로토콜의 메서드를 모두 구현했기 때문입니다.

     

    파이썬에서 비슷하면서 유명한 얘기가 있죠. "If it walks like a duck and it quacks like a duck, then it must be a duck" 

     

     

     

    참고로 runtime_checkable은 함수의 시그니처까지 보진 않습니다. 단지 같은 이름의 메서드를 구현했냐 까지만 봅니다.

    아래 코드를 보시면 두 클래스의 to_sjon 메서드 시그니처가 다르지만, isinstance의 결과는 여전히 True인 것을 볼 수 있습니다.

     

    메서드 뿐만 아니라 클래스가 품는 변수까지 검사 대상이 됩니다.

    User Prtoocol은 id를 갖고 있습니다.

    UserTypeA역시 id를 갖고 있고, UserTypeB는 id가 없을 때,
    UserTypeA는 User의 instance로 인식되고, UserTypeB는 그렇지 않게 안식됩니다.

    3. 코드 사용 예시(openai)

    openai 공식 파이썬 라이브러리에서의 사용 예제를 살펴보겠습니다.

     

    CursorPageItem 클래스를 Protocol로 만들고, runtime_checkable 데코레이터를 걸어놨습니다.

    next_page_info 메서드에서 item이라는 변수가 CursorPageItem의 인스턴스인지, 즉 id라는 변수를 갖고 있는지 검사를 합니다.

     

    댓글

Designed by Tistory.