Python のベストライブラリ in 2018

<!-- Python のベストライブラリ in 2018 -->

# はじめに

Python で開発をしていてこれは便利！と思ったライブラリを 5 つ紹介したいと思います。

# Pendulum

- GitHub: https://github.com/sdispater/pendulum
- 公式サイト: https://pendulum.eustace.io/

`Pnedulum` は日付/時間計算ライブラリです。標準ライブラリの `datetime` をうまくラップして使い勝手を向上させています。タイムゾーンの変換のようによく使われる機能から「次の土曜日」といった、たまに欲しくなる機能まで揃えているので、一度使ったらもう標準ライブラリには戻れないです。公式サイトも非常におしゃれでドキュメントも読みやすくなっています。

ちなみに Python で日付/時間計算ライブラリといえば最近は [Arrow] が紹介されることが多いのですが、Arrow の API には振る舞いが予想しづらいものがあるようで、その辺りの分かりづらさを解決するために Pendulum が開発されたそうです。

[Arrow]: https://github.com/crsmithdev/arrow

# Requests-HTML

- Github: https://github.com/kennethreitz/requests-html
- 公式サイト: http://html.python-requests.org/

`Requests-HTML` はクローラライブラリです。HTTP ライブラリとして非常に有名な [Requests] の作者である Kenneth Reitz 氏が開発したライブラリで、Requests の機能に HTML のパース機能を備えたものとなっています。

これまでクローリングといえば Requests で HTML を取得して [Beautiful Soup] でパースするやり方がよく使われてきましたが、これからはこのライブラリ 1 つで両方をまかなうことができます。HTML の要素選択には CSS セレクタと XPath の両方が使用できます。

さらに素晴らしい機能として、JavaScript を評価することができるのです！これで JavaScript をレンダリングしないと参照できなかった HTML 要素も取れますね。そのようなことができるのは、内部で使用している [Pyppeteer] というライブラリのおかげです。このライブラリも大変素晴らしいのでこのあと紹介します。

[Requests]: https://github.com/requests/requests
[Beautiful Soup]: https://www.crummy.com/software/BeautifulSoup/bs4/doc/
[Pyppeteer]: https://github.com/miyakogi/pyppeteer

# Pyppeteer

- GitHub: https://github.com/miyakogi/pyppeteer

Pyppeteer はヘッドレス Chrome ライブラリです。ヘッドレス Chrome というのはコード上で実行できる Chrome ブラウザ（ヘッドレスブラウザ）のことです。

先日 Google が Chrome にヘッドレスブラウザモードを搭載しましたが、ヘッドレスブラウザを操作する API として [Puppeteer] という Node.js 製の API を公開しました。 Pyppeteer はその非公式な Python ラッパになります。

基本的には [Selenium] と同じことができるのですが、Puppeteer が Google 公式の API ということで Chrome 操作に関しては Puppeteer / Pyppeteer の方が充実した機能が取り込まれることが期待できます。

[Puppeteer]: https://github.com/GoogleChrome/puppeteer
[Selenium]: https://www.seleniumhq.org/

# Loguru

- GitHub: https://github.com/Delgan/loguru

`Loguru` はロギングライブラリです。Python には `logging` というロギングライブラリが標準で搭載されていますが、設定周りが結構面倒で毎回同じような雛形コードを書く必要があります。しかし Loguru を使うとその辺の面倒な設定をあらかじめ行った状態でロギングインスタンスが使えるようになるので、非常に手軽にロギングが可能となっています。

面白いと思った機能は例外を自動で補足してログに出力してくれる `@logger.catch` というデコレータです。これを関数に付けておけば例外を勝手にロギングしてくれるようになります。

Loguru はログの見栄えにもこだわっていて、例外発生時のバックトレースが非常に分かりやすくなっています（下記は GitHub のサンプルを引用）。

```python
2018-07-17 01:38:43.975 | ERROR    | __main__:nested:10 - What?!
Traceback (most recent call last, catch point marked):

  File "test.py", line 12, in <module>
    nested(0)
    └ <function nested at 0x7f5c755322f0>

> File "test.py", line 8, in nested
    func(5, c)
    │       └ 0
    └ <function func at 0x7f5c79fc2e18>

  File "test.py", line 4, in func
    return a / b
           │   └ 0
           └ 5

ZeroDivisionError: division by zero
```

いわゆる Power Assert スタイルのバックトレースになっています。この綺麗なバックトレース出力は [better-exceptions] というライブラリによるものです。better-exceptions は単体で使ってもかなり役に立つのでこちらもおすすめです。

[better-exceptions]: https://github.com/Qix-/better-exceptions

# Responder

- GitHub: https://github.com/kennethreitz/responder
- 公式サイト: https://python-responder.org/

`Responder` は Kenneth Reitz 氏による Web フレームワークです。Python の Web フレームワークというと Flask, Django が有名で、それらにつづくフレームワークがいくつか出ているという感じで若干乱発している状態なのですが、Responder は各種ライブラリをうまく連携させて 1 つのフレームワークとして形成されており、全くのゼロベースで作られたものではないところが見事な作りだと思いました。

Flask は機能を最小限にしていることで毎回 Flask と一緒に使うライブラリ（WSGI, CORS ライブラリなど）を用意する必要がありますが、逆に Django は機能が豊富すぎてオーバースペック気味になることが多いです。一方で Responder が持つ機能は多すぎず少なすぎず、丁度いい分量で設計されているところに扱いやすさを感じました。

OpenAPI や GraphQL など最近のトレンドをサポートする機能も備わっているので、Python 製 Web フレームワークのデファクトになってもらいたいです。

# まとめ

いずれも便利なライブラリですので、ぜひご活用下さい。