선택한 이름이 의미가 너무 좁은 것 같아 이상함
이름만 보면 고유 심볼 같은 쪽이 더 유연한 기본 요소였을 듯함. 실제로는 거의 심볼처럼 동작할 테니 그렇게 쓸 수는 있겠지만, 이름을 “Sentinels”로 붙인 건 어색함. Lisp에 익숙해서 그렇게 느끼는 걸 수도 있음
목표는 SENTINEL_A가 SENTINEL_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은 함수가 값을 어떻게 쓸지 꽤 많은 정보를 줌. 예를 들어 T가 color라면 auto는 흰색/검은색 같은 기본값을 고르거나 부모에서 상속할 가능성이 높고, T는 색을 명시적으로 설정하며, none은 맥락에 따라 색을 아예 설정하지 않거나 투명으로 처리할 수 있음
흥미롭고, 일부 패키지의 의미론이 어떻게 바뀔지 궁금함. 예를 들면 Item | None을 반환하는 대신 아래처럼 쓸 수 있음
Lobste.rs 의견들
선택한 이름이 의미가 너무 좁은 것 같아 이상함
이름만 보면 고유 심볼 같은 쪽이 더 유연한 기본 요소였을 듯함. 실제로는 거의 심볼처럼 동작할 테니 그렇게 쓸 수는 있겠지만, 이름을 “Sentinels”로 붙인 건 어색함. Lisp에 익숙해서 그렇게 느끼는 걸 수도 있음
SENTINEL_A가SENTINEL_B와 다른 타입이 되게 해서, 어떤 값이is_a SENTINEL_A인지 물을 수 있게 하는 것 같음Ruby의 심볼은 그렇게 동작하지 않음:
:beef.is_a? :droog.class #=> trueLiteral과 리터럴 문자열이 있음이것들이 이름 있는 센티널인 이유는 sentinel values가 Python에서 흔한 개념이자 패턴이고, 센티널은 그 패턴 사용에서 생기는 일부 문제를 좁게 해결하려는 것이기 때문임. “Motivation”과 “Rationale” 절에서 설명한 그대로임
또한 센티널은 값 의미론을 갖지 않으므로, 같은 이름의 센티널 두 개도 서로 다른 값이고 서로 같지 않음. 그래서 심볼처럼 동작하지도 않고 그렇게 쓰면 안 됨
명명 인자의 기본값 문제에서는 Typst에
none과 함께auto값만 추가해도 원하는 거의 모든 명명 인자 인터페이스를 표현할 수 있음none만으로는 대부분의 명명 인자 기본값으로 의미가 잘 맞지 않음.none은 기본 반환값으로는 좋지만 함수 인자로 들어가면 명사로서 올바른 의미를 담지 못하는 경우가 많음.matrix(axes=None)은 축을 제거한다는 뜻인지, 평소처럼 유지한다는 뜻인지 애매함.none을 넘기는 것과 아무것도 넘기지 않는 것이 다른지도 불명확함. 매개변수 포함 여부를 구분하려고 다중 디스패치로 가면, 그 매개변수의 동작을 문서화할 중심 위치를 잃게 됨auto는 “가진 정보로 적절히 처리하라”는 뜻을 그대로 담는 훌륭한 기본값임.auto | none시그니처는 더 명시적인 불리언처럼 쓸 수 있고,T | auto | none은 함수가 값을 어떻게 쓸지 꽤 많은 정보를 줌. 예를 들어T가color라면auto는 흰색/검은색 같은 기본값을 고르거나 부모에서 상속할 가능성이 높고,T는 색을 명시적으로 설정하며,none은 맥락에 따라 색을 아예 설정하지 않거나 투명으로 처리할 수 있음흥미롭고, 일부 패키지의 의미론이 어떻게 바뀔지 궁금함. 예를 들면
Item | None을 반환하는 대신 아래처럼 쓸 수 있음물론 여러 센티널로 추가 의미를 담을 수도 있음. 원래도 가능했지만 문서에 “공식적으로 권장되는” 방식은 없었음. 이게 패키지 작성자들을 다른 방향으로 이끌 수도 있음
다소 억지 예시지만, 이 경우 기존 ID는 있으나 연결된 값이 없는 상황과 그런 ID 자체가 없어서 실패한 상황을 구분할 수 있음. “Python다운” 방식은 아마 예외를 쓰는 쪽이겠지만, 보통 Python을 작성할 때보다 더 함수형 접근처럼 보임
그냥 JavaScript의
SymbolAPI를 도입하는 편이 더 나았을 것 같음. 일반적으로도 쓸모가 있고, 여기서 해결하려는 문제도 같이 해결됨