最強のPython開発環境 PyCharmのすゝめ

私はPython歴はかれこれ7年程になり、PyScripterやVimなど色々な開発環境を変遷してきた。
その中で**PyCharmが最強のPython開発環境**であると断言する。

![687474703a2f2f692e696d6775722e636f6d2f4b4f5273636b562e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/140075/acbeeed9-c707-423f-e340-4fa882d13c58.png)
[PyCharm Home Page](https://www.jetbrains.com/pycharm/)

開発はIntelliJ IDEAのJetBrainsで、最近はGo言語用IDEのGoglandを発表している。
動作環境はWindows/OS X/Linuxのマルチプラットフォームである。
PyCharmは無償版と有償版があるが、普通の開発ならば無償版で充分すぎるほど機能が備わっている。

PyCharmがいかに便利であるか紹介してみよう。

# リアルタイムのコードチェックと修正機能
PyCharmはリアルタイムにコードをチェック（PyFlakes使用）してくれるが、Vimでも同様の事ができるので目新しい事ではない。
PyCharmの素晴らしい所は、**警告個所を適切に修正してくれる機能**があることだ。

例えば、このようなコードを書いたとしよう。

```python
member = {}
member["name"] = "Tim"
member["age"] = 32
member["sex"] = "men"
```

PyCharmはダメな部分に波線を出して警告してくれる。

<img width="341" alt="pycharm1.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/2c881314-ca1e-042a-dc77-42e10743c5cd.png">

何を言っているかわからないが、波線部分にカーソルを移動し「Alt+Enter」(Windowsの場合)を押してみよう。

<img width="194" alt="pycharm2.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/c94b7cce-143e-29fc-6d81-f3a6371c4019.png">

警告の解決方法を提示してくれるので、「Replace dictionary creation」を選択してみよう。

```python
members = {"name": "Tim", "age": 32, "sex": "men"}
```

複数行にわたる冗長な変数宣言と初期化が、１センテンスに最適化された。
このようにPyCharmは困ったときに「Alt+Enter」を押せば、**だいたいなんとかしてくれる**のである。

あと地味に便利なのが、**英辞書を搭載しており単語のスペルミスや複数形の間違いを指摘**してくれる。

<img width="191" alt="pycharm3.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/6c1dc1df-5f07-56d4-1260-6581c01fb58e.png">


上図は「property」の複数形を「propertys」（正しくは「properties」）と書こうとして指摘されている例である。
私はこの警告機能のお陰で、何回か恥ずかしい英単語ミスをコミットせずに済んでいる。

すべてのコードを一括でインスペクト（検査）したい場合は、メニュー「Code」→「Inspect Code...」を選択して一括検査することができます。

![範囲を選択_034.png](https://qiita-image-store.s3.amazonaws.com/0/140075/d7e89dc6-804b-42ee-dbb0-21761e7a2c0a.png)


# 強力なタイプヒンティング
Pythonは言わずと知れた動的型付き言語である。
動的型付き言語であるがゆえに補完が効きにくかったり、引数に無効な型を指定してしまいエラーが出たりするのも事実である。
PyCharmではタイプヒンティングにより、まるで**静的型付け言語のように事前に型チェック**させる事ができる。

例えば数字の桁を求める関数```get_digit```を定義したとしよう、引数は```int```または```float```を受け付ける。引数に```str```や```list```を指定すると、TypeErrorとなる。

```python
def get_digit(x):
    digit = 0
    while x > 0:
        x //= 10
        digit += 1
    return digit
```
```python:実行結果
get_digit(130)
>>> 3
get_digit(130.0)
>>> 3
get_digit("text")
>>> TypeError
```

PyCharmのタイプヒンティングを記述してみよう、引数または関数にカーソルを合わせ「Alt+Enter」を押すと、タイプヒンティングのひな形を生成してくれるので、記述は非常に楽である。

<img width="280" alt="pycharm4.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/7479b788-b255-be38-5bfe-0ae4b6ee056f.png">

タイプヒンティングを記述したコードは以下の通り。

```python
def get_digit(x):
    """
    :type x: int or float
    :rtype: int
    """
    digit = 0
    while x > 0:
        x //= 10
        digit += 1
    return digit
```
タイプヒンティングを記述したあと、```get_digit```に文字列を渡そうとすると警告が出るようになる。

<img width="296" alt="pycharm5.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/70757a32-919a-0543-cac1-16642a44380c.png">

私は関数のコメントは書かないが、タイプヒンティングだけは書くようにしている。（命名が適切であればコメントは不要の精神）

ちなみにクラスメンバにタイプヒンティングを設定したい場合は、以下のように書く。

```python
class A(object):
    """
    :type name: basestring
    :type description: basestring or None
    """
    def __init__(self, name):
        self.name = name
        self.description = None
```

PyCharmを使えばPythonが**動的型付け言語と静的型付け言語のおいしいとこ取りの最強言語**と化すのである。
なお、Python3.5から導入された型アノテーションにも対応している。

タイプヒンティングの詳しい情報は、下記のJet Brainsのヘルプを参照されたい。
[Type Hinting in PyCharm](https://www.jetbrains.com/help/pycharm/2016.3/type-hinting-in-pycharm.html)

# <i class="fa fa-search" aria-hidden="true"></i> 便利なコード検索機能

`Shift`を2回押すと出てくる検索ウインドウがかなり便利。

![メニュー_035.png](https://qiita-image-store.s3.amazonaws.com/0/140075/7ad7945e-4a75-32ea-c73c-75e7fe7d1264.png)

これだけで、ファイル、クラス、メソッド、メンバ、変数まで、すべての検索がここに集約されている。
`Ctrl + Shift + F`のグレップ検索もある、コードの検索はたった２つの機能さえ覚えれば良い

# 地味に便利なTODO一覧機能

メニューの「View」→「Tool Windows」→「TODO Alt+F6」でソースに書いたTODOコメントの一覧も集約して表示してくれる。

![範囲を選択_036.png](https://qiita-image-store.s3.amazonaws.com/0/140075/05e3bff9-9d6e-9357-6ca2-98e9444be3b9.png)

Jenkinsなどを使ったCIでTODO一覧を出してくれる機能があるが、これはサーバーを用意せずともローカルで実行できるので地味に便利だ。

# リファクタリング機能
リファクタリングの機能も充実している。

動的型付け言語ながら、変数名やメンバ名のリネームなどはスコープなどを考慮して**良い感じにリネーム**してくれる。
もちろん、動的型付け言語なのでメンバ名のリネームは正確に行われない場合もある。リファクタリングの確度を上げるためにも、タイプヒンティングは出来るだけ記述しておくべきである。


# ファイルテンプレート
よく使うファイルのひな形も用意されている。
標準でUnitTestとSetupScriptのテンプレートも用意されているため、UnitTestやsetup.pyの作成負荷が大幅に軽減される。

もちろん、独自のテンプレートも設定可能である。
右クリックメニューから「New」->「Edit File Templates...」から編集できる。

<img width="375" alt="pycharm6.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/763a4d08-1182-b4bf-8cf8-229a95b9a7b9.png">

もちろんテンプレート変数も用意されているため、日付や作成者など自動で挿入可能である。

私はPySide/PyQtの開発で、UIフォームファイルを登録している。
詳しくは[「最強のPySide/PyQt開発環境もPyCharmである#ファイルテンプレートに「Qt UI Designer Form」を追加する」](http://qiita.com/pashango2/items/5d3c278f05ad151bfd5a#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%ABqt-ui-designer-form%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)を参照してほしい。

ファイルテンプレートの詳しい情報は、下記のJet Brainsのヘルプを参照されたい。
[Creating and Editing File Templates](https://www.jetbrains.com/help/pycharm/2016.3/creating-and-editing-file-templates.html)

# 豊富なデバッグ機能
デバッグ機能も豊富で基本的な事はほぼ出来ると思って良い。

- ブレイクポイントの設置
- 条件付きブレイクポイントの設置
- ウォッチ式
- スタックトレース
- カーソル行まで実行(Alt+F9)

下図はデバッグ時のエディター表示である、変数の横に現在の値が表示されるため情報が非常に見やすくなっている。

<img width="315" alt="pycharm7.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/0f8a5571-de34-36b3-4b3f-7ed9bf0558d8.png">

ちなみに条件付きブレークポイントの設定方法だが、ブレイクポイントを右クリックで設定画面が出るので「Condition」に条件式を記述するだけである。

<img width="251" alt="pycharm8.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/8bd32473-75f1-da63-c9cf-aab020e20ad4.png">

やはりデバッガがGUIで操作できると、デバッグ効率が格段に上がる。
ある程度の大規模のプロジェクトになるとデバッガが必須となるので、PyCharmは手放すことができない。

# VCS（バージョン管理システム）との連携

Git、MercurialなどのVCS（バージョン管理システム）と連携しており、ファイルの追加など簡単な操作はPyCharm上で行える。

特に追跡済み、未追跡、未コミットのファイルがそれぞれ色分けされるので、コミット状況が一目でわかるのは便利だ。

簡単なVCSの履歴確認くらいなら下図のようにPyCharm上から確認ができる。

![2017-01-23_13h50_37.png](https://qiita-image-store.s3.amazonaws.com/0/140075/e62b3632-666e-8e28-ec51-bc85b8f0203b.png)


# Anaconda仮想環境に対応

PyCharmではAnacondaの仮想環境にも対応している。
メニュー「File」->「Settings」->「Project Interpreter」
プロジェクトごとにPython環境を設定できる。

<img width="501" alt="pycharm9.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/bb7f8d22-1867-042e-bfb2-1d9778c1527e.png">


私の環境はMiniconda(Anacondaの最小構成版）で、Python2.7/3.4/3.5と3つのPython仮想環境が混在している。

そこでPythonルートディレクトリを作成し、各Pythonバージョンごとにプロジェクトを作成している。サンプルコードや各プロダクトはサブプロジェクトとして管理している。
今まで書き溜めたプロダクトやサンプルコードを、PyCharm上でツリー状に閲覧できるため便利である。

```:Pythonディレクトリ構成
Python/
  ├ Python35/
  |   ├ project a
  |   ├ project b
  |   └ moules
  |
  ├ Python34/
  |   ├ project a
  |   ├ project b
  |   └ moules
  |
  └ Python27/
     ├ project a
     ├ project b
     └ moules
```

こうすることにより「activate/deactivate」コマンドを打たずに、PyCharmプロジェクトを切り替えるだけで仮想環境も切り替える事ができる。

プロジェクト構造化の設定は、ディレクトリの右クリックメニュー「Mark Directory as」→「Sources Root」で設定できる。「Sources Root」に設定すると、そのディレクトリをサブプロジェクトのルートとして扱ってくれる。

<img width="328" alt="pycharm10.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/34384743-a809-024b-470f-d1d50b297079.png">


プロジェクトの構造化に関しての詳しい情報は、下記のJet Brainsのヘルプを参照されたい。

[Configuring Project Structure](https://www.jetbrains.com/help/pycharm/2016.3/configuring-project-structure.html)


# Jupyter Notebookとの連携
PyCharm上からJupyter Notebook(IPython)と連携も可能で、右クリックメニュー「New」->「Jupyter Notebook」で作成できる。

<img width="695" alt="pycharm12.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/ada90dc6-3680-08d6-8dfa-119bf8f50a05.png">

コード補完はPyCharmのものが使われるので、ブラウザ実行よりも快適である。
ただし、Jupyterで出来たキーボードショートカットが使えないのは残念。

私はPILを使った画像処理をテストするのにJupyter Notebookをよく使うのだが、Windowsでコマンドラインから「Jupyter Notebook」を起動すると、使いもしないMicrosoftEdgeが立ち上がる現象から開放された。

Jupyterとの連携については、下記のJet Brainsのヘルプを参照されたい。

[Using IPython/Jupyter Notebook with PyCharm](https://www.jetbrains.com/help/pycharm/2016.3/using-ipython-jupyter-notebook-with-pycharm.html)

# 便利なプラグイン
PyCharmのベースとなっているIntelliJ IDEAには豊富なプラグインが用意されており、PyCharmでもそのプライグインを使うことができる。

私がPyCharmで便利に使っているプラグインは`File Watchers`というプラグインだ。ファイルを監視して更新時に自動でコマンドを走らせるタスクランナーである。

私はPySide/PyQtのuiファイルを自動でコンバートさせている。
詳しくは[「最強のPySide/PyQt開発環境もPyCharmである#uiファイルを自動的にpyファイルに変換」](http://qiita.com/pashango2/items/5d3c278f05ad151bfd5a#ui%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%ABpy%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E5%A4%89%E6%8F%9B)を参照してほしい。

下記のJet Brainsのヘルプも参照されたい。

[Using File Watchers](https://www.jetbrains.com/help/pycharm/2016.3/using-file-watchers.html)


# まとめ
PyCharmは、ここで紹介しきれないほど機能が沢山ある、おそらく私の知らない便利機能もまだまだある事だろう。Pythonを使いながらPyCharmを使っていない人は非常に損をしていると思う。

特にコード補完が素晴らしいので、Python初心者こそPyCharmを使ってほしい。
本当に素晴らしいツールである。


記事の続きを書きました、[「私が実践しているPyCharmの運用ルール」](http://qiita.com/pashango2/items/6ab6d94a8aba2a2fefc8)。


# リンク（随時更新）
その他、PyCharmの魅力を伝える記事を追記していく。

[【PyCharm5.0新機能】async/awaitのスレッド実行状況を可視化してデバッグする](http://qiita.com/haminiku/items/92c51f2caf5d8cf679a6)

[「PythonでJupyterノートブック「.ipynb」を生成する」](http://qiita.com/pashango2/items/589522868a27ccdfdc55)

[忙しい人のためのIntelliJ IDEAショートカット集（´-`）](http://qiita.com/yoppe/items/fd03607d4d4f191d32dd)

[意外と知らないIntelliJ IDEAのGit管理機能いろいろ（´-`）](http://qiita.com/yoppe/items/fd03607d4d4f191d32dd)