이전 글 : 파이썬으로 URL 가지고 놀기 - yarl 편

yarl은 immutable에 적극적이며 익숙한 개발자에게 urllib의 좋은 대안이 될 수 있는 라이브러리다. 그러나 나는 yarl이 그렇게나 까는 mutable 객체를 제공하는 라이브러리를 원했다. 아래와 같은 이유에서다.

  • Python은 immutable에 민감한 언어가 아니다.
  • 객체의 매 변화마다 새로운 객체의 copy가 생성되는 것(immutable)보다, 그냥 기존 객체에 변화가 반영되는 것(mutable)이 인식적인 입장에서 더 자연스럽고 쉽다. 예를 들면, 주유소에서 자동차에 연료를 채울 때, 해당 자동차의 연료 상태가 변화하는 것이 연료가 채워진 새로운 자동차가 생성되는 것보다 더 자연스럽다.
  • 객체의 상태(state) 변화는 실수를 일으키기 쉬우며, 동시성 위에서 버그가 잦다는 것, 그리고 게임 캐릭터와 같은 복잡한 객체가 아니라면 객체 copy에 큰 비용이 소모되지 않으므로 immutable이 더 일반적이라는 것을 인정하지만 그냥 mutable이 쓰기 더 편할 것 같았다. 기술적으로 더 합리적인 라이브러리가 아니라 그냥 더 편한 라이브러리를 찾는 과정이었기 때문이다.

길은 가까이에 있었는데, yarl이 '우리랑 비슷한 건데 얘는 immutable이 아니라서 우리가 더 나아요'하는 furl이었다.

furl

설치

$ pip install furl

Quickstart

아래는 URL에 path와 query parameter를 추가하는 예제다. furl도 URL의 요소를 쪼개는 형태는 yarl과 비슷하니 이야기하지 않겠다.

from furl import furl

f = furl('https://velog.io')

f.path.add('/tags')
f.args['sort'] = 'popular'
print(f.url) # 'https://velog.io/tags?sort=popular'

.copy()

copy() 메소드는 새로운 furl 객체를 만들어 반환한다. copy와 함께 in-line modification 메소드인 add, set, remove도 사용해 보겠다.

from furl import furl

f = furl('https://velog.io')

print(
  f.copy()
  .set(path='/tags')
  .add(args={'sort': 'popular'})
  .add(args={'keyword': 'planb'})
  .remove(['keyword'])
  .url
) # 'https://velog.io/tags?sort=popular'
print(f.url) # 'https://velog.io'

결론

  • yarl은 immutable에 익숙해지기만 한다면 충분히 편하게 쓸 수 있는 라이브러리다.
  • furl은 문서화가 비교적 직관적으로 잘 쓰여져 있고, 당장 쓰기 편했다.

추가적으로, yarl과 furl의 소스 코드는 정말 배울 점이 많아 보인다. 시간 있을 때 한 번쯤 읽어봐도 좋을 것 같았다.