VscodeでPythonを始めるなら知っておきたい単語

# あらすじ

Pythonをvscodeで始めるにあたって、知っておくといい単語を集めました。
vscodeの設定項目の中に登場するものたちです。

# Pyright

https://microsoft.github.io/pyright/
黄鉄鉱(pyrite)を意味し、大規模開発での利用にも耐える高速型チェッカー。

Pyrightはあくまでも型に関連する機能を提供するツールであり、シンタックスハイライトなどは含まれません。
VSCodeやNeovimにはデフォルトでPython用シンタックスハイライトが組み込まれていますが、
NeovimなどではTreesitterなどを使う、VSCodeではPylanceを利用するなど、
よりリッチな開発体験を得る工夫をすることが出来ます。

# Pylance

https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance
VSCode専用の高速で機能豊富なPythonの言語サポート拡張機能
Pylanceは、Visual Studio Code内のPythonと連携して動作する拡張機能で、高性能な言語サポートを提供します。内部的には、PylanceはMicrosoftの静的型チェックツールであるPyrightによって動力を供給されています。Pyrightを使用することで、Pylanceは豊富な型情報をもってPythonのIntelliSense体験を強化する能力を持ち、より良いコードをより速く書く手助けをします。

PylanceはVisual Studio CodeでのPythonのデフォルト言語サポートであり、そのオプションの依存関係としてPython利用時にサジェストされます。
しかし、VSCode以外のエディタではPyright単体での利用となるため、チーム内で開発体験を揃える意味ではPyright拡張機能を使う方が良いのかもしれません。

Pylanceという名前は、モンティ・パイソンのランスロットへの小さな敬意であり、彼は聖杯を求める際に橋番の質問に最初に答えた騎士でした。

# Bandit

https://pypi.org/project/bandit/
日本語にすると「盗賊」です。名前は怪しいですが、セキュリティ指向の静的分析ツールです。

Banditは、Pythonコードに共通するセキュリティ上の問題を発見するために設計されたツールです。これを行うために、Bandit は各ファイルを処理し、そこから AST を構築し、AST ノードに対して適切なプラグインを実行します。Banditがすべてのファイルのスキャンを終えると、レポートを生成します。

# Yapf

https://opensource.google/projects/yapf
Googleの中で作られたPythonフォーマッターです。

YAPFは公式のGoogle製品（実験的またはその他）ではなく、たまたまGoogleが所有しているコードにすぎません。

Python用の現在のフォーマッタのほとんど（autopep8やpep8ifyなど）は、コードからlintエラーを削除するために作成されています。これには明確な制限がいくつかあります。たとえば、PEP8ガイドラインに準拠するコードは再フォーマットされない場合があります。しかし、それは見栄えが良いとは限りません。

YAPFは別のアプローチを取ります。 DanielJasperによって開発された「clang-format」に基づいています。本質的に、アルゴリズムはコードを取得し、元のコードがスタイルガイドに違反していなくても、スタイルガイドに準拠する最適なフォーマットに再フォーマットします。このアイデアは、Goプログラミング言語の「gofmt」ツールにも似ています。フォーマットに関するすべての紛争を終わらせます。変更が加えられるたびにプロジェクトのコードベース全体がYAPFを介してパイプされるだけで、スタイルはプロジェクト全体で一貫性を保ちます。すべてのコードレビューでスタイルについて議論する意味はありません。

最終的な目標は、YAPFが生成するコードが、プログラマーがスタイルガイドに従っている場合に作成するコードと同じくらい優れていることです。それはあなたのコードを維持する上での面倒な部分を取り除きます。

# Black

https://github.com/psf/black
Blackは妥協のないPythonコードフォーマッタです。これを使うことで、手作業でのフォーマットの細かいコントロールをフォーマッターに譲ることになります。その見返りとして、Blackはあなたにスピード、決定力、そしてpycodestyleの煩わしさからの解放を与えてくれます。時間と精神的なエネルギーを節約して、より重要なことに充てることができるようになります。

ブラック化されたコードは、プロジェクトに関係なく同じように感じられます。
しばらくすると書式設定がクリアになり、本質に集中することができます。

Black は、可能な限り最小の差分を生成することで、コードのレビューを高速化します。

# Autopep8

https://pypi.org/project/autopep8/
PEP8スタイルガイドに準拠するようにPythonコードを自動的にフォーマットするツールです。

autopep8 は PEP 8 スタイルガイドに適合するように Python コードを自動的にフォーマットします。autopep8 は pycodestyle ユーティリティを使用してコードのどの部分をフォーマットする必要があるかを判断します。 autopep8 は pycodestyle によって報告されたフォーマットの問題のほとんどを修正することができます。

# Flake8

https://flake8.pycqa.org/en/latest/# Flake8

モジュール式ソースコードチェッカー: pep8 pyflakes など
webpackのpythonフォーマッター版という感じでしょうか。

flake8 は Python プロジェクト間でスタイルの一貫性を強制するためのコマンドラインユーティリティです。デフォルトでは、PyFlakes プロジェクトによって提供される lint チェック、PyCodeStyle プロジェクトによって提供される PEP-0008 にインスパイアされたスタイルチェック、そして McCabe プロジェクトによって提供される複雑さチェックが含まれています。また、サードパーティの拡張機能がインストールされているのが見つかれば、それを実行します。

# Mypy

https://mypy.readthedocs.io/en/stable/
Mypyは静的型チェッカーです。

Mypy は、Python 用の静的型チェックツールです。Python プログラムに型ヒント (PEP 484) を追加し、mypy を使って静的に型チェックを行うことができます。プログラムを実行しなくてもバグを発見できます！Pythonを知っていれば、始めるのは簡単です。

### 動的と静的

動的型付けと静的型付けを混在させることができます。レガシーコードなどで静的型付けが不便な場合は、いつでも動的型付けに戻すことができます。

### 強力な型システム

Mypyは、双方向型推論、ジェネリック、呼び出し可能型、抽象基底クラス、多重継承、タプル型などの機能を備えたパワフルでモダンな型システムを持っています。

### Python のライブラリへのアクセス

一般的に使用されている多くのライブラリにはスタブ（静的に型付けされたインターフェース定義）があり、これにより mypy はあなたのコードがライブラリを正しく使用しているかどうかをチェックすることができます。

~~### まだBeta~~

~~Mypyは多くの企業やプロジェクトで使用されていますが、mypyは公式にはベータ版のソフトウェアです。後方互換性を壊すような変更が時々あるでしょう。mypy開発チームは、ユーザーコードへの変更の影響を最小限に抑えようとしています。~~

# Pytest

https://docs.pytest.org/en/stable/
pytest フレームワークを使用すると、小規模なテストを簡単に書くことができます。さらに、アプリケーションやライブラリの複雑な機能テストをサポートするために拡張することができます。

※個人的に一番覚えやすかったので好んで使っています。

# Conda

https://docs.conda.io/en/latest/
あらゆる言語（Python、R、Ruby、Lua、Scala、Java、JavaScript、C/ C++、FORTRANなど）のパッケージ、依存関係、環境管理ができます。最近は vscode も入っているようです。ということは、Conda は Homebrew や Chocolatey に近い存在と言ってもいいのかもしれません。

Conda は、 Windows 、 macOS 、 Linux 上で動作するオープンソースのパッケージ管理システムと環境管理システムです。Condaは、パッケージとその依存関係を迅速にインストール、実行、更新します。Condaは、ローカルコンピュータ上で環境の作成、保存、ロード、切り替えを簡単に行うことができます。Conda はもともと Python プログラムのために作成されましたが、あらゆる言語のソフトウェアをパッケージ化して配布することができます。

パッケージマネージャとしての Conda は、パッケージを探してインストールするのに役立ちます。異なるバージョンの Python を必要とするパッケージが必要な場合でも、condaは環境マネージャでもあるので、別の環境マネージャに切り替える必要はありません。conda は環境マネージャでもあるからです。グローバル環境では Latest バージョンの Python を実行しながら、わずか数回のコマンドで、異なるバージョンの Python を実行するための完全に別の環境を設定することができます。

デフォルトの設定では、Conda は、Anaconda® によってビルド、レビュー、メンテナンスされている repo.anaconda.com の千個のパッケージをインストールして管理することができます。

Condaは、Travis CIやAppVeyorなどの継続的インテグレーションシステムと組み合わせることで、自動化されたテストを頻繁に行うことができます。

Condaを使うなら２つのディストリビューションから選択することになります。重くても最初から全部入りが欲しい人向けのAnacondaと、軽量スタイルでプロジェクトごとに仮想環境を変えながら作業する人向けのMiniconda があります。どちらを選んでも condaコ マンドは同じものが付いてきます。
Miniconda ではなく Anaconda には GUI が付いてきますが、グローバル環境に大量のライブラリが事前インストールされているため、ベテランには敬遠される傾向にあります。

また、pythonにある程度なれた人や、Web系開発者は`python -m venv .venv`を使うため、condaはあまり使われません。最近は、npmやrubygems、composerなどの影響を受けた、poetory、pyenvなどもあります。condaは大学などでの科学計算で使われることが多いようです。

`conda`コマンドではチャンネル「anaconda,anaconda-enterprise,conda-forge,pypi」から選んでライブラリをインストールすることになります。

# env

Pythonでenvというと仮想環境の事です。PythonをインストールするとPythonが使える環境が用意されます。そして、そのPythonをグローバル環境といいます。このグローバル環境を使って作る新しいPython環境のことを仮想環境またはローカル環境と言います。（てきとーに断言しています。間違っていたらご指摘ください。）

# Jedi

https://pypi.org/project/jedi/
宇宙をまたにかけ、超能力とプラズマの棒を操る人間ではありません。
テキストエディタに使えるPythonの自動補完ツールです。

「え？インテリセンスは？」と思いましたか？
そうなんです。インテリセンスじゃなくてJediなんです。

Jediは、一般的にIDE/エディタプラグインで使用されているPython用の静的解析ツールです。Jediはオートコンプリートとgoto機能に重点を置いています。その他の機能としては、リファクタリング、コード検索、リファレンスの検索などがあります。

JediはシンプルなAPIで動作します。VIM-Pluginとしてのリファレンス実装があります。REPLでの自動補完も可能です。IPythonはこれをネイティブで使用しており、CPythonのREPLにはそれをインストールすることができます。Jediはよくテストされており、バグはほとんどないはずです。

# Prospector

https://pypi.org/project/prospector/
Python静的分析ツールです。

ProspectorはPythonのコードを解析し、エラー、潜在的な問題、規約違反、複雑さに関する情報を出力するツールです。

Pylint、pep8、McCabe complexなどの他のPython解析ツールの機能をまとめています。完全なリストは[サポートされているツール](http://prospector.readthedocs.io/en/latest/supported_tools.html)のドキュメントセクションを参照してください。

Prospectorの主な目的は、「箱から出してすぐに使える」ことです。他のPython解析ツールの共通の不満は、どのエラーが自分のコーディングスタイルに関連しているか、あるいは興味深いものであるかをフィルタリングするのに時間がかかることです。Prospectorはいくつかのデフォルトプロファイルを提供しており、これはうまくいけば良い出発点となり、すぐに役立つでしょう。

# Pycodestyle

https://pypi.org/project/pycodestyle/
pycodestyle は、PEP 8 のいくつかのスタイル規約に照らし合わせて Python のコードをチェックするためのツールです。

### 注意点

このパッケージは以前は pep8 と呼ばれていましたが、混乱を避けるために pycodestyle に改名されました。詳細については、[Guido がこの変更を要求した問題](https://github.com/PyCQA/pycodestyle/issues/466)や、PyCon 2016 での @IanLee1521 によるライトニングトークの[スライド](https://speakerdeck.com/ianlee1521/pep8-vs-pep-8)[ビデオ](https://youtu.be/PulzIT8KYLk?t=36m)を参照してください。

### 特徴

プラグインのアーキテクチャ：新しいチェックの追加は簡単です。
構文解析可能な出力：エディタでエラーの場所にジャンプします。
小さい: Pythonファイルは1つだけで、必要なのはstdlibだけです。pycodestyle.pyファイルだけを使用することができます。
包括的なテストスイートが付属しています。

# Pydocstyle

http://www.pydocstyle.org/en/stable/
pydocstyleはPythonのdocstringの規約に準拠しているかどうかをチェックするための静的解析ツールです。

pydocstyleはPEP 257のほとんどをサポートしていますが、リファレンス実装と考えるべきではありません。

pydocstyleはPython 3.5, 3.6, 3.7, 3.8をサポートしています。

# Pylama

https://readthedocs.org/projects/pylama/
コード監査ツールです。

PythonとJavaScriptのコード監査ツール。Pylamaはこれらのツールをラップしています。

- pycodestyle (formerly pep8) © 2012-2013, Florent Xicluna;
- pydocstyle (formerly pep257 by Vladimir Keleshev) © 2014, Amir Rachum;
- PyFlakes © 2005-2013, Kevin Watters;
- Mccabe © Ned Batchelder;
- Pylint © 2013, Logilab (should be installed 'pylama_pylint' module);
- Radon © Michele Lacchia
- gjslint © The Closure Linter Authors (should be installed 'pylama_gjslint' module);
- eradicate © Steven Myint;
- Mypy © Jukka Lehtosalo and contributors;

# Pylint

https://www.pylint.org/
Pythonコードにスターを付けましょう！

Pylint は Python の静的コード解析ツールで、プログラミングエラーを探したり、コーディング標準の実施を支援したり、コードの匂いを嗅ぎつけたり、簡単なリファクタリングの提案をしたりします。

Pylintは様々なIDEに組み込まれています。そのため、一度は耳にしたことがあるかもしれません。

Pylintは高度に設定可能で、コード内からエラーや警告を制御するための特別なプラグマを持っており、また、広範な設定ファイルからも制御できます。また、独自のチェックを追加したり、何らかの方法でpylintを拡張するための独自のプラグインを書くことも可能です。

# Pipenv

https://pipenv-ja.readthedocs.io/
Pipenv は、全てのパッケージングの世界 (bundler、composer、npm、cargo、yarnなどなど。) における最高のものをPythonの世界にもたらすことを目的としたツールです。 PipenvコミュニティではWindowsは第一級市民です。

Pipenvは、手動でパッケージのインストールおよびアンインストールを行うのと同じように Pipfile に対してパッケージの追加および削除を行うのに加え、自動でプロジェクト用の仮想環境を作成し管理します。 またPipenvは、いかなるときも重要な Pipfile.lock を生成し、これを利用しビルドが常に同じ結果になるようにします。

Pipenvは主にアプリケーションのユーザーと開発者に、簡単に作業環境を作れる方法を提供するためのツールです。

# Poetry

https://python-poetry.org/
Poetryには、決定論的な方法でプロジェクトを管理するために必要なすべてのツールが付属しています。

例えば、存在すれば必ず解決策を見つけてくれる、網羅的な依存関係リゾルバが付属しています。

設定されたvirtualenvsフォルダにフォルダを作って仮想環境を作成するか、システムから常に分離されるようにプロジェクト独自のフォルダを作成します。

Pythonプロジェクトを最初から最後まで管理する単一のツールであり、信頼性が高く直感的なものとしてコンセプトを設定しています。

# Nosetest

https://nose.readthedocs.io/en/latest/
Nose は過去数年間メンテナンスモードにあり、新しい人やチームがメンテナンスを引き継がなければ、おそらく終了するでしょう。新しいプロジェクトは Nose2, py.test, あるいは単なる unittest/unittest2 の使用を検討してください。

Nose のキャッチフレーズは "nose extends unittest to make testing easier" です。
これはかなりよく知られた python のユニットテストフレームワークで、doctests、unittest、"no boilerplate" テストを実行することができます。このコンセプトに共感した方は、メンテナンスを引き継いでみてはいかがでしょうか。

# Unittest

https://docs.python.org/ja/3/library/unittest.html
ユニットテストフレームワーク

unittest ユニットテストフレームワークは元々 JUnit に触発されたものです。そのため、他の言語の主要なユニットテストフレームワークと似ています。テストの自動化、テスト用のセットアップやシャットダウンのコードの共有、テストのコレクション化、そして報告フレームワークからのテストの独立性をサポートしています。

これを実現するために、 unittest はいくつかの重要な概念をオブジェクト指向の方法でサポートしています。

# Venv

https://docs.python.org/ja/3/library/venv.html
仮想環境の作成

標準ライブラリとして装備されている仮想環境構築ツールです。

# Jupyter

https://jupyter.org/
木星のJupiterとpythonを掛けているんですね。

ノートブックのようにコード管理できるシステムです。コードブロックと文章ブロック、そして実行結果ブロックからなるページを作って管理します。これをWebサービス化したものが、Googleの[Colaboratory](https://colab.research.google.com/)です。

# Rope

https://rope.readthedocs.io/en/latest/overview.html
Rope は強力で安全なリファクタリングを提供することを目指しています。VSCodeではオブジェクトのリネーム機能を利用した時にサジェストされます。
Rope は依存関係が軽く、Rope は Python 自体にのみ依存します。そのため、Python仮想環境を作成した場合、その内部にインストールするのが通例です。
PyRight や PyLance とは異なり、Rope は Python 自体で書かれているため、問題が発生した場合でも、使い慣れた言語を使用して自分でデバッグしたりハッキングしたりできます。

また、PyRight や PyLance とは異なり、Rope は Node.js に依存しません。そして、PyLance や PyCharm とは異なり、Rope はオープンソースです。
Jedi と比較して、Rope はリファクタリングに重点を置いています。Jedi はいくつかの基本的なリファクタリング機能を提供しますが、Rope は Jedi が提供しない多くの高度なリファクタリング操作とオプションをサポートします。

# まとめ

これらのツールを名前とコンセプトだけでも知っておけば、vscodeの設定を変更するときに迷いがなくなりそうですね。
また、「vscodeの設定画面にあるやつだ」という安心感はprojectで使用するツールの選定にも役立ってくれそうです。

::: note info
参考までに、筆者のお気に入りセットは「pylint, pyright(pylance), black, poetry, pytest」です。
:::

**Excelsior!**