Decimal – 보다 정확한 소수점 산술

들어가기 전에 다음과 같은 코드를 보자. 흔히 하는 실수 중에 하나 인데 float 타입 값으로 반복횟수가 제한된 루프를 만드려고 시도하는 것이다.

a, b = 1, 0.1
while a != 0:
  print(a)
  a -= b

하지만 안타깝게도 이 코드는 의도대로 실행되지 않을 것이다. 왜냐하면 1.0 에서 0.1을 열 번 뺀다하더라도 0이 되지 않기 때문이다. 어째서? (실제로 파이썬 쉘에서 1.0 / 10 == 0.1 이고, 0.1 * 10 == 1 이다)

Decimal – 보다 정확한 소수점 산술 더보기

Swift 프로퍼티의 옵저버에 대한 규칙

  • lazy 프로퍼티는 옵저버를 가질 수 없다. (단 최초 액세스 이후 변경하는 것은 가능하다.)
  • computed 프로퍼티에 대해서는 옵저버를 설치하는 것이 의미가 없다. 단 상속받은 computed 프로퍼티에 대해서는 옵저버를 설치할 수 있다.
  • 옵저버는 해당 클래스의 지정 이니셜라이저 내에서 값을 변경하는 경우에는 호출되지 않는다.
  • 단, 상속받은 프로퍼티가 옵저버가 설치되어 있다면 부모의 지정 이니셜라이저 호출 후에 변경한다면, 부모의 옵저버가 호출될 것이다.
  • 비슷하게 편의 이니셜라이저에서는 지정 이니셜라이저를 통해 초기화한 후, 프로퍼티값을 다시 변경하면 옵저버가 실행된다.

lazy 프로퍼티와 옵저버

lazy 프로퍼티는 옵저버를 가질 수 없다. 위에서 설명한 옵저버와 관련된 규칙들을 살펴보면, 다음과 같은 가설을 세울 수 있다. 1) 옵저버는 객체 인스턴스의 초기화가 완료된 시점부터 작동한다. 2) 객체의 초기화는 지정 이니셜라이저가 실행을 완료한 시점으로 본다.

그런데 lazy 프로퍼티는 약간 예외적이다. 왜냐하면 지정이니셜라이저가 실행을 완료했다하더라도 느긋하게 초기화되는 프로퍼티는 아직 초기화 되기 전이기 때문이다. 따라서 위 가설에서 1번 항목에 따라 지정 이니셜라이저가 실행되었더라도 옵저버가 동작 가능한 시점이 결정되지 않는다. 아래는 이 부분이 언급된 공식 문서의 내용.


You can add property observers to any stored properties you define, except for lazy stored properties. You can also add property observers to any inherited property (whether stored or computed) by overriding the property within a subclass. You don’t need to define property observers for nonoverridden computed properties, because you can observe and respond to changes to their value in the computed property’s setter. Property overriding is described in Overriding.

상속된 계산 프로퍼티에는 옵저버 설치가 가능하다?

보통 옵저버는 저장 프로퍼티에 설치한다. 계산 프로퍼티의 경우에는 set 하는 과정 자체가 별도의 코드를 실행하는 것이므로 사실상 옵저버가 필요 없다. 하지만 이렇게 set이 가능한 계산 프로퍼티에 대해서 이를 상속받는 서브 클래스는 해당 프로퍼티를 오버라이드하여 didSet, willSet 옵저버만 추가하는 것이 가능하다. (당연히 setter를 오버라이드하는 경우에는 옵저버를 추가할 수 없다.)

코코아바인딩에서 집합 타입의 프로퍼티를 연결할 때 유의할 점

코코아 바인딩을 사용할 때 특정한 키 이름이 변경가능한 배열(NSMutableArray)일 때, UI를 통해 값을 추가/제거하거나 변경한다 하더라도 이러한 변경이 원래 데이터에 반영되지 않는 문제가 발생하는 경우가 있다.

원문 : 코코아 바인딩 문제해결(Troubleshooting Cocoa Bindings)
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/Troubleshooting.html

집합 컨트롤러가 현재 데이터를 표시하지 않아요.

“이러한 문제는 보통 여러분의 애플리케이션이 집합 콘텐츠를 키-밸류 옵저빙 호환 방식으로 데이터를 변경하지 않기 때문에 일어납니다. 배열을 addObject:removeObject: 로 제거하는 것만으로는 부족합니다.”

코코아바인딩에서 집합 타입의 프로퍼티를 연결할 때 유의할 점 더보기

예제로 알아보는 argparse 사용법

몇 년 전에 argparse의 사용법을 간단하게 정리한 글을 발행했는데, 우연히 몇 가지 찾아보다 보니 기능설명의 나열만 읽어봐서는 애매한 부분도 많고 원하는 형태로 설정하는 것도 계속 헷갈려서 큰 맘 먹고 총정리 하는 마음으로 새로운 글을 하나 써보기로 마음 먹었다. 오늘은 명령줄 인자를 파싱하는 도구인 argparse를 어떻게 사용하는지, 그리고 몇몇 경우에 있어서 옵션의 동작을 어떻게 설정하는지를 좀 더 자세히 살펴보고자 한다.

예제로 알아보는 argparse 사용법 더보기

Asyncio를 사용한 비동기 소켓 통신

이 블로그에서는 파이썬으로 소켓 통신을 구현하는 몇 가지 방법을 이미 살펴본 바 있습니다. 원시 소켓인 socket.socket을 사용하는 방법zmq의 REQ-REP 패턴을 사용한 방법이 있었고, 다중 접속을 허용하도록 스레드를 통해 처리하거나, 셀렉터를 사용하여 단일 스레드에서 멀티플렉싱하는 방법도 알아보았습니다. 이번 글에서는 asyncio에서는 과연 소켓 통신을 어떤식으로 구현하는지 살펴보고 역시나 간단한 비동기 다중 접속 에코 서버를 구현하는 과정을 함께 살펴보겠습니다.

Asyncio를 사용한 비동기 소켓 통신 더보기