Lobste.rs 의견들
  • 선택한 이름이 의미가 너무 좁은 것 같아 이상함
    이름만 보면 고유 심볼 같은 쪽이 더 유연한 기본 요소였을 듯함. 실제로는 거의 심볼처럼 동작할 테니 그렇게 쓸 수는 있겠지만, 이름을 “Sentinels”로 붙인 건 어색함. Lisp에 익숙해서 그렇게 느끼는 걸 수도 있음

    • 목표는 SENTINEL_ASENTINEL_B다른 타입이 되게 해서, 어떤 값이 is_a SENTINEL_A인지 물을 수 있게 하는 것 같음
      Ruby의 심볼은 그렇게 동작하지 않음: :beef.is_a? :droog.class #=> true
    • Lisp식 사고가 맞음. 넓은 용도로 쓰는 게 바람직하고 해결해야 할 문제라고 전제하고 있지만, Python에는 이미 Lisp 심볼의 대부분 사용 사례를 위한 Literal 과 리터럴 문자열이 있음
      이것들이 이름 있는 센티널인 이유는 sentinel values가 Python에서 흔한 개념이자 패턴이고, 센티널은 그 패턴 사용에서 생기는 일부 문제를 좁게 해결하려는 것이기 때문임. “Motivation”과 “Rationale” 절에서 설명한 그대로임
      또한 센티널은 값 의미론을 갖지 않으므로, 같은 이름의 센티널 두 개도 서로 다른 값이고 서로 같지 않음. 그래서 심볼처럼 동작하지도 않고 그렇게 쓰면 안 됨
  • 명명 인자의 기본값 문제에서는 Typst에 none과 함께 auto만 추가해도 원하는 거의 모든 명명 인자 인터페이스를 표현할 수 있음
    none만으로는 대부분의 명명 인자 기본값으로 의미가 잘 맞지 않음. none은 기본 반환값으로는 좋지만 함수 인자로 들어가면 명사로서 올바른 의미를 담지 못하는 경우가 많음. matrix(axes=None)은 축을 제거한다는 뜻인지, 평소처럼 유지한다는 뜻인지 애매함. none을 넘기는 것과 아무것도 넘기지 않는 것이 다른지도 불명확함. 매개변수 포함 여부를 구분하려고 다중 디스패치로 가면, 그 매개변수의 동작을 문서화할 중심 위치를 잃게 됨
    auto는 “가진 정보로 적절히 처리하라”는 뜻을 그대로 담는 훌륭한 기본값임. auto | none 시그니처는 더 명시적인 불리언처럼 쓸 수 있고, T | auto | none은 함수가 값을 어떻게 쓸지 꽤 많은 정보를 줌. 예를 들어 Tcolor라면 auto는 흰색/검은색 같은 기본값을 고르거나 부모에서 상속할 가능성이 높고, T는 색을 명시적으로 설정하며, none은 맥락에 따라 색을 아예 설정하지 않거나 투명으로 처리할 수 있음

  • 흥미롭고, 일부 패키지의 의미론이 어떻게 바뀔지 궁금함. 예를 들면 Item | None을 반환하는 대신 아래처럼 쓸 수 있음

    NOT_FOUND = sentinel("NOT_FOUND")  
    def get_item(iid: str) -> Item | NOT_FOUND: ...  
    

    물론 여러 센티널로 추가 의미를 담을 수도 있음. 원래도 가능했지만 문서에 “공식적으로 권장되는” 방식은 없었음. 이게 패키지 작성자들을 다른 방향으로 이끌 수도 있음

    MISSING_ID = sentinel("MISSING_ID")  
    MISSING_VALUE = sentinel("MISSING_VALUE")
    
    def get_item(iid: str) -> Item | MISSING_ID | MISSING_VALUE: ...  
    

    다소 억지 예시지만, 이 경우 기존 ID는 있으나 연결된 값이 없는 상황과 그런 ID 자체가 없어서 실패한 상황을 구분할 수 있음. “Python다운” 방식은 아마 예외를 쓰는 쪽이겠지만, 보통 Python을 작성할 때보다 더 함수형 접근처럼 보임

    • 예전에는 더미 클래스를 만들고 모듈별로 인스턴스화하던 싱글턴을 더 깔끔하게 쓰는 방식처럼 보임
      class _MissingId: ...
      
      MISSING_ID = _MissingId()
      
      # elsewhere  
      from ... import MISSING_ID  
      
      Symbols가 떠오름
    • PEP에서는 관련된 여러 센티널 값을 정의하거나 그 사이에 정렬 순서까지 둘 수 있다면, 대신 Enum이나 비슷한 것을 쓰라고 함
  • 그냥 JavaScript의 Symbol API를 도입하는 편이 더 나았을 것 같음. 일반적으로도 쓸모가 있고, 여기서 해결하려는 문제도 같이 해결됨