6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PyCharmでは未importのクラスや関数の入力補完ができない、と思い込んでいた話

Last updated at Posted at 2020-05-30

TL;DR

PyCharmではCtrlを押したままSpaceを2回叩くと幸せになれる

PyCharmが大好き、でも

Pythonは2.7あたりの頃から使っていて、作業効率化ツール開発やpyserialを使った組み込み機器との通信テストなどで使用していました。当初からわりと規模が大きめなプロジェクトで使っていたので、対話シェルやコマンドラインベースではなく、PyCharmのお世話になりながらPythonと付き合ってきました。

私はAndroidアプリ開発もやってますが、Android Studioができる前からEclipse+ADTを窓から投げ捨てIntelliJ IDEAを採用していたので、JetBrains IDEにかなり親しみを持っており、その操作感覚を引き継げるPyCharmでの開発は本当に本当に大好きでした。

ただ、ある一点を除いては・・・

他のJetBrains IDEと同じような感覚で入力補完できない・・・?

IntelliJ(Android Studio)やRiderは、プロジェクトの依存関係を読み取って、そのプロジェクトで使用できる全てのシンボルを把握してくれます。
そのため、ソースコードの先頭にimport(Java, Kotlin)やらusing(C#)やらを書かずとも、プログラマがその場で入力した文字からクラス名・関数名などの入力補完のリストを構築してくれます。

これは未importなシンボルに対しても候補を作ってくれるというのが強いところで、プログラマはなんとな〜くクラスやグローバル関数の存在だけを覚えておき、てきと〜に入力して候補から見つけ出すというのを繰り返すだけで立派なコードが書けることになります。この手の機能はJetBrains IDEに限らず他のモダンなエディタにも搭載されていて、この感覚でコーディングするのが現代のプログラミングのやり方だと思います。

この機能は新しいライブラリを投入してそれについて勉強中のときにも力を発揮します。例えば、ライブラリ内のクラスが継承関係に基づいて親の名前の一部を引き継ぐ命名規則になっている場合、親の名前を入力したときに子のクラス名も一緒に候補に出てきてくれるので、「あ〜こういうクラスツリーがあるのか〜」といった具合で全体像を楽に把握することもできます。

PyCharmでは先にimport文を書いてないと入力候補に出してくれない?

で、この未importに対する入力補完機能、なぜかPyCharmには搭載されてない・・・ ように見えました。

例えばpipでpyserialを入れてきたあと、COMポートの一覧を出すためのlist_portsを使おうとしてlisと入力しても、候補リストは現れてくれません。
スクリーンショット 2020-05-30 13.09.23.png
なんと実行環境を整えてたとしても、コード側では事前にいちいちfrom serial.tools import list_portsを書いておかないとlisの入力時点で出てきてくれないのです。
スクリーンショット 2020-05-30 13.10.03.png

**こんなのは嫌だ。面倒臭すぎる。**PyCharmは開発マシンのPython実行環境自体を認識してますから、lisの入力時点でlist_portsを提案できるはずです。

ただ、Auto Importなる機能はあります。これはコード内に解決できないシンボルがあり、かつ同名のシンボルがPyCharmによって把握されている場合において、PyCharmがimport文の挿入を提案してくれるものです(まあこれも大抵のIDEには搭載されてますよね)。
この機能を使えば、list_portsと正確に入力すれば、ようやくimport提案をしてくれるようになります。
スクリーンショット 2020-05-30 13.10.42.png
ちょっと私が求めてるものとは違いますが、まあ仕方なしとして、この機能を活用してPyCharmでの大規模開発を進めてきました。が、やはりこれを軸にするのは少々無理があり、少し名前を打ち間違うとimport提案してくれませんので、長い名前のクラスを使うときにはストレスでした。

調べてみたらできるらしい、けど

自分が最強の開発環境だと確信しているJetBrains IDEシリーズのPyCharmを使っているのに、こんな謎の苦しい思いをするなんて、絶対何かが間違っている・・・そういう引っ掛かりが昨日までありました。

友人との会話中、久しぶりにこの疑問が再燃し、数年ぶりにこの話題を調べてみました。
すると以下の公式ブログに辿り着きました(2018年の記事って・・・気付くのが遅くてショック)

Let PyCharm Do Your Import Janitorial Work | PyCharm Blog
https://blog.jetbrains.com/pycharm/2018/11/let-pycharm-do-your-import-janitorial-work/

CtrlSpaceSpace-02.gif

Start typing part of requests and type Ctrl-Space-Space. PyCharm will offer a completion. When you accept it, PyCharm will complete the symbol and also generate the import.

リクエストの一部を入力して、Ctrl-Space-Spaceと入力します。PyCharm が補完を提示してきます。それを受け入れると、PyCharm はシンボルを完成させ、インポートを生成します。

!?!?!?!?!?!?!?!? まさかのショートカットキー!?!? しかも2回!?!?

なぜかPyCharmは他のJetBrains IDEのノリと異なり、未importモジュールに対する入力補完は自動的には表示されず、わざわざショートカットキーを2回も押さなければならないようです。

ナンデ!?

試してみたらOSのショートカットキーと衝突してた

まあ何か大人の事情があったんだろうということで、残念感は置いといて、記事の通りCtrl+Space+Space(つまりCtrlを押したままSpaceを2回叩く)を実行してみると・・・
スクリーンショット 2020-05-30 12.10.43.png
入力ソース切り替えと被ってるやんけ・・・・
設定をいじってオフにしましょう・・・
スクリーンショット 2020-05-30 13.17.08.png
これでPyCharmでも他環境と同じように、ショートカットキーさえ押していれば、未importを含む全てのシンボルに対する入力補完が効くようになりました!最高!
スクリーンショット 2020-05-30 13.12.01.png
これからはコードを書き出す前に毎回Ctrl+Space+Spaceを2回叩くのを習慣化することで、常に候補リストとともに生活し、短時間で大量のPythonコードを書き出せるようにしたいと思います。


しかし、なぜPyCharmだけショートカットキー必須になってるのでしょう・・・?
Pythonはアクセスコントロールがゆるゆるですから、候補リストの生成に時間かかるようになり、そこからの性能悪化を恐れてこうしたんですかね?でも最近の開発マシンなら大したことないんじゃないかなあ。
または、アンダースコアから始まる外に見せたくないものが積極的に見えるようになるのを嫌がったとかですかね?

ところでVSCodeでのPython環境を実は整えてないんですが、同様の機能が使えるのであればそろそろ整備したいです。PyCharmは素晴らしいものですが、ちょっとした実験コードを書くためだけに動かすのは大袈裟ですからね。


※この件に関してのTwitterでの愚痴:

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?