Python 3.5から変数宣言時などに型を指定できるらしいけど...

f:id:ts0818:20201223182903j:plain

鋳造(ちゅうぞう、casting)は、材料(主にアルミ合金真鍮などの金属)を融点よりも高い温度で熱して液体にしたあと、型に流し込み、冷やして目的の形状に固める加工方法である。

鋳造 - Wikipedia

鋳造に使用する型のことを鋳型(いがた)といい、鋳造でできた製品のことを鋳物(いもの)という。英語で casting といえば、鋳造と鋳物の双方を指す。

鋳造 - Wikipedia

鋳造は紀元前3600年頃にメソポタミア青銅を利用して始まったとされている。さらにふいごの発明でより高い温度を得られるようになり青銅器時代は全盛となった。

鋳造 - Wikipedia

⇧ これまた歴史ありですが、溶鉱炉とかで液体になった鉄とか相当に高温だと思うんだけど、その熱した金属を掬う容器が溶けないもんなんですね。

 

溶鉱炉と言えば、 

ターミネーター2 (字幕版)

ターミネーター2 (字幕版)

  • 発売日: 2019/11/25
  • メディア: Prime Video
 

⇧ 名作「ターミネーター2(監督:ジェームズ・キャメロン)」を思い出しますね。 

 というわけで、今回はPythonについてです。

レッツトライ~。

 

Python3.5から型の指定できるらしい

Pythonの公式のドキュメントによりますと、 

docs.python.org

typing --- 型ヒントのサポート

バージョン 3.5 で追加

ソースコード: Lib/typing.py

注釈

Python ランタイムは、関数や変数の型アノテーションを強制しません。 型アノテーションは、型チェッカー、IDE、linterなどのサードパーティーツールで使われます。

https://docs.python.org/ja/3/library/typing.html

⇧ ってことみたいね。 

Pythonは、「動的型付け言語」ってポジションなので、

動的型付け(どうてきかたづけ、dynamic typing)とは、プログラミング言語で書かれたプログラムにおいて、変数や、サブルーチン引数や返り値などの値について、そのを、コンパイル時などそのプログラムの実行よりも前にあらかじめ決めるということをせず、実行時の実際の値による、という型システムの性質のことである。

動的型付け - Wikipedia

⇧ ってな感じで、プログラミングが実行されて初めて変数などの「型」がハッキリするっていう特徴がありますと。

一方、Javaのような「静的型付け言語」の場合、

静的型付け(せいてきかたづけ、static typing)は、プログラミング言語で書かれたプログラムにおいて、変数や、サブルーチン引数や返り値などの値について、そのが、コンパイル時など、そのプログラムの実行よりも前にあらかじめ決められている、という型システムの性質のことである。

静的型付け - Wikipedia

⇧ ってな感じで、プログラミングの実行前に変数などの「型」がハッキリしますと。

「静的型付け言語」の場合、コーディング時に「型」を明示してあげないといけませんと。つまり、変数やメソッドの引数、戻り値などに「型」っていう制限を設ける必要がありますと。

で、そんな「型」の指定をPythonでもできるようになったそうな、ただし、

ってことみたい。 

 

Pythonってどんな型があるんでしたっけ?

そもそも、これまで「型」を指定する必要がなかったPythonなのですが、どんな「型」があるんでしたっけ?gammasoft.jp

⇧ 上記サイト様がまとめてくださっています。

で、公式のドキュメントを見てみても、結構、カオスな感じなんですよね...

整数として、

  • 整数(int)
  • ブール値(bool)

 の2種類っていう分類は衝撃でしたね、確かに「ブール値」もコンピューター上では「0」か「1」って結果になるから「整数」ってことになるのかもしれないんだけど、

ブール値 (bool)

真偽値の False と True を表します。False と True を表す 2 つのオブジェクトのみがブール値オブジェクトです。ブール型は整数型の派生型であり、ほとんどの状況でそれぞれ 0 と 1 のように振る舞いますが、例外として文字列に変換されたときはそれぞれ "False" および "True" という文字列が返されます。

https://docs.python.org/ja/3/reference/datamodel.html#the-standard-type-hierarchy

⇧ って「文字列」返しとるやん...

何か、

新たな型 (有理数や、整数を効率的に記憶する配列、など) の追加は、たいてい標準ライブラリを通して提供されますが、将来のバージョンの Python では、型の階層構造にこのような追加がなされるかもしれません。

https://docs.python.org/ja/3/reference/datamodel.html#the-standard-type-hierarchy

⇧「型」が定まって無いっぽいのね...

Pythonの「型」ってのが曖昧な感じになってるので、 

note.nkmk.me

⇧ 上記サイト様でも説明がありますが、Pythonの「配列」って「一次元配列」しか作れないんですって。

しかも、部分切り出しの方法の記述が独特で、

teratail.com

qiita.com

www.headboost.jp

⇧ 初見殺しとしか言いようがない...

説明されないと直感的に分かり辛いよね...

 

「型」指定でコーディングしてみる

Pythonで開発ってなった場合に、

のどっちかを使うことが多いのかとは思いますが、今回は、「Visual Studio Code」を使っていこうかと。

というのも、

forest.watch.impress.co.jp

⇧「Visual Studio Code」の拡張機能で「Pylance」ってものが利用できるようになったみたいなので。

ちなみに、

docs.microsoft.com

⇧「Visual Studio Code」でPythonプログラミングを実施するには、

は最低限、必要らしいので、まだお済でない方は、上記サイト様を参考にインストールしてみてください。

ちなみに、 

gammasoft.jp

qiita.com

Pythonを複数インストールしてる場合は注意が必要ですかね。

あと、

docs.microsoft.com

py.exe ランチャーは、インストールされている中で最も新しいバージョンの Python を自動的に選択します。 py -3.7 などのコマンドを使用して特定のバージョンを選択したり、使用できるバージョンを py --list を使用して確認したりすることもできます。 ただし、py.exe ランチャーが正しく動作するのは、python.org からインストールしたバージョンの Python を使用している場合だけです。Microsoft Store から Python をインストールする場合、py コマンドは含まれません LinuxmacOS、WSL、および Microsoft Store バージョンの Python の場合、python3 (または python3.7) コマンドを使用する必要があります。

https://docs.microsoft.com/ja-jp/windows/python/faqs

⇧ ってな感じで、正しく動かない場合があるので、必ず「python.org」からインストールする必要がありますと。

ちなみに、自分の環境では「py.exe」は上手く動きませんでした...

f:id:ts0818:20201220184500p:plain

 

まぁ、「py.exe」が上手く動かないのは致し方ないということで、Pythonを試すためのディレクトリを作っときますか。

docs.python.org

venv --- 仮想環境の作成

バージョン 3.3 で追加.

ソースコード: Lib/venv/

venv モジュールは、軽量な "仮想環境" の作成のサポートを提供します。仮想環境には、仮想環境ごとの site ディレクトリがあり、これはシステムの site ディレクトリから分離させることができます。それぞれの仮想環境には、それ自身に (この仮想環境を作成するのに使ったバイナリのバージョンに合った) Python バイナリがあり、仮想環境ごとの site ディレクトリに独立した Python パッケージ群をインストールできます

Python仮想環境に関してより詳しくは PEP 405 を参照してください

https://docs.python.org/ja/3/library/venv.html#module-venv

仮想環境 を作成するには venv コマンドを実行します:

python3 -m venv /path/to/new/virtual/environment

https://docs.python.org/ja/3/library/venv.html#module-venv

⇧ ってあるんで、適当な場所にディレクトリを作成します。

今回は「C:\Users\[ユーザー名]\Desktop\soft_work\python_work\typeHintingTest」ってディレクトリを作成しました。

f:id:ts0818:20201220192727p:plain

そんでは、用意したディレクトリにPythonの仮想環境を作成しましょう。

f:id:ts0818:20201220193700p:plain

f:id:ts0818:20201220194132p:plain

Python仮想環境ができました。

Python仮想環境を有効化するには、「[Python仮想環境のディレクトリ]\Scripts」フォルダに配置されてる「アクティベーション」ファイルを実行しますが、

f:id:ts0818:20201220194501p:plain

⇧ プラットフォーム毎に、使用するファイルが異なります。

自分の環境は、Windowsなので、

を使う感じになるかと。 

ちなみに、Pythonの標準でないツールを使う場合、

qiita.com

結局のところ、Python での Poetry + pyenv の組み合わせは、Node.js での npm + nodist といったところでしょうか。引き続き自分にあった構成や環境をいろいろと試していきたいと思います。

https://docs.microsoft.com/ja-jp/windows/python/faqs

⇧「Poetry」「pyenv」といったものを導入する感じですかね。

今回は、Python 3.3から標準ライブラリとなった「venv」のみで基本的な環境を準備するで良しとしました。

ここからは、Visual Studio Codeを使っていきます。Visual Studio Code拡張機能の「Pylance」もインストールする必要があるので。

Visual Studio Codeを起動して、「拡張機能」のアイコンf:id:ts0818:20201222193444p:plain をクリックし、検索で「pylance」と入力して該当する拡張機能がヒットしたら「インストール」押下で。

f:id:ts0818:20201222193359p:plain

インストールされたら、Pythonの仮想環境であるディレクトリを開きます。

「ファイル(F)」>「フォルダーを開く...」で。

f:id:ts0818:20201222193804p:plain

f:id:ts0818:20201222194020p:plain

そしたらば、適当に「.py」ファイルを作成してみます。

f:id:ts0818:20201222194349p:plain

f:id:ts0818:20201222194513p:plain

何か再起動を求められたので、「Yes, and reload」で。

f:id:ts0818:20201222194605p:plain

はい、エラー。

f:id:ts0818:20201222194710p:plain

どうやら、

qiita.com

⇧ 上記サイト様によりますと、初回起動時に発生する問題らしい。「×」で閉じて、Visual Studio Code自体を再起動すればOKらしい。

で、再起動しても駄目でした...

ただ、Visual Studio Codeのバージョンアップしたら、エラー消えました、う~ん謎過ぎる...。

f:id:ts0818:20201222195857p:plain

とりあえず、Pythonで型を指定して変数を宣言してみた。

from typing import List

list:List[int] = [0,1,2,3,4,5,6,7,8,9]
print(list)

で、実行してみる。

エディターの右上にあるアイコンf:id:ts0818:20201222201504p:plainをクリックすれば、「ターミナル」でPythonファイルの内容が実行されるらしい。

f:id:ts0818:20201222201142p:plain

実行されました。

f:id:ts0818:20201222201632p:plain

せっかくなので、Python仮想環境を有効化して、Pythonのライブラリをインストールしてみたいと思います。

PowerShellを使ってる場合は、「[Python仮想環境のディレクトリ]\Scripts\Activate.ps1」を実施します。

[Python仮想環境のディレクトリ]\Scripts\Activate.ps1

f:id:ts0818:20201222202359p:plain

Python仮想環境が有効化されました。

機械学習のライブラリをインストールしてみます。今回は「scikit-learn」ってライブラリをインストールしたいと思います。

github.com

scikit-learn requires:

  • Python (>= 3.6)
  • NumPy (>= 1.13.3)
  • SciPy (>= 0.19.1)
  • joblib (>= 0.11)
  • threadpoolctl (>= 2.0.0)

https://github.com/scikit-learn/scikit-learn

⇧ バージョン 0.23だと、上記のライブラリを事前にインストールする必要があるみたいね。

う~ん、「scikit-learn」とかインストールしたら一緒にインストールされるような感じで依存関係を解決してくれれば良い気はするんだけど、そんな気が利いたことは無理みたいなので、個別にインストールしていくしか無さそうね...

 

www.saintsouth.net

⇧ 上記サイト様によりますと、「requirements.txt」にライブラリを記載すれば一括でライブラリをインストールできるらしい。

qiita.com

⇧ pipenvってものを使えば、自動で「requirements.txt」のようなパッケージをリスト化したファイルが作成されるらしい。

今回は、pipで「requirements.txt」を使ってインストールしてみます。

ちなみに、

pythonanaconda.com

promptなどの黒い画面に白い文字でプログラムを打つような画面の場合は、

pip ~~~~~

とそのまま打てばいいのですが、SpyderやJupyterの場合はpipの前にビックリマークを付ける必要があります。

!pip -V

【Python導入編④】pip、import、その他プログラムを走らせる方法 | Python機械学習で実験!データ解析

⇧ っていうわけ分からん仕様になってるので、環境によって注意が必要ですかね。

「requirements.txt」をPythonの仮想環境のディレクトリに作成します。

f:id:ts0818:20201222204922p:plain

「」に以下のライブラリを記載して保存で。

###### Requirements with Version Specifiers ######
# scikit-learn
NumPy >= 1.13.3
SciPy >= 0.19.1
joblib >= 0.11
threadpoolctl >= 2.0.0   

f:id:ts0818:20201222205601p:plain

そしたらば、「ターミナル」で以下を実施してライブラリをインストール。

pip install -r requirements.txt

f:id:ts0818:20201222205714p:plain

f:id:ts0818:20201222205817p:plain

f:id:ts0818:20201222210005p:plain

⇧ インストールできたみたいなので、「scikit-learn」をインストールで。

pip install -U scikit-learn

f:id:ts0818:20201222210112p:plain

f:id:ts0818:20201222210133p:plain

f:id:ts0818:20201222210211p:plain

⇧ インストールできました。

「[Python仮想環境のディレクトリ]\Lib\site-packages」にインストールされてるみたいです。

f:id:ts0818:20201222210352p:plain

f:id:ts0818:20201222213933p:plain


で、残念ながら、Visual Studio Codeを使ってる場合は、Pythonの仮想環境のPythonを使うことをVisual Studio Codeの設定で明示してあげないと、Pythonの仮想環境にインストールしたライブラリを読み込むことができないというね。

Visual Studio Codeのエディタ上のアイコンのf:id:ts0818:20201222222038p:plainで実施した場合と、「ターミナル」で実行するPythonが異なってることが原因。

これは、以下のコードを実施してみることで確認できます。(Visual Studio Codeのエディタ上のアイコンのf:id:ts0818:20201222222038p:plainで実施した場合と、「ターミナル」で実施した場合で結果を比較します。)

import sys
print(sys.version)
print(sys.path)    

f:id:ts0818:20201222221951p:plain

Visual Studio Codeのエディタ上のアイコンのf:id:ts0818:20201222222038p:plainで実施するPythonを、Python仮想環境のPythonにしてあげる必要があります。(じゃないと、コーディング時に、[Python仮想環境のディレクトリ]\Lib\site-packagesにインストールしたライブラリ群がimportできない)

そのためには、Python仮想環境のディレクトリにVisual Studio Codeワークスペースを作ってあげる必要がありますと。

ts0818.hatenablog.com

⇧ 自分の過去記事でまとめてましたかね。ただ、1年ぐらい前なのでVisual Studio CodeGUIが変わってました、っていうかGUIはあんまり変えて欲しくないな...。

logixsquare.com

現在、venvを使用する場合は、上記settings.jsonのように記入すれば問題ありません。

VS CodeでWorkspace毎に使用するPython実行環境を切り替える | LogixSquare

⇧ 上記サイト様でも「.vscode」を作成するで問題なさそうって仰っているので大丈夫かと。

では、Visual Studio Codeで「ファイル(F)」>「ユーザー設定」>「設定」を選択。(自分の過去記事を確認したら、旧いバージョンのVisual Studio Codeだと「ユーザー設定」でなく「基本設定」になってるっぽい)

f:id:ts0818:20201222220916p:plain

ワークスペース」タブが選択された状態で、「設定(JSON)を開く」のアイコンをクリック。

f:id:ts0818:20201222221021p:plain

f:id:ts0818:20201222221119p:plain

で、「.vscode/setting.json」に以下のように設定。「${workspaceRoot}」は、Visual Studio Codeで開いたディレクトリまでのパスらしい。(自分の場合は、Python仮想環境のディレクトリである「C:\Users\Toshinobu\Desktop\soft_work\python_work\typeHintingTest」までのパスってことになります。) 

{
    "files.eol": "\n",
    "terminal.integrated.env.windows": {
        "PATH": "${workspaceRoot}\\Scripts;${env:PATH}"
    },
    "python.pythonPath": "${workspaceRoot}\\Scripts\\python.exe"
}

f:id:ts0818:20201222223231p:plain

そうすると、Visual Studio Codeのエディター上で使用されるPythonについても、Python仮想環境のものに切り替えられたことが、エディターの左下に表示されてるPythonの情報で確認できます。

f:id:ts0818:20201222223552p:plain

見事、Python仮想環境にインストールしたライブラリ(「[Python仮想環境のディレクトリ]\Lib\site-packages」にインストールされてます)が、コーディングの際にimportできるようになります。

ただ、何か「numpy」の読み込みでエラーが起きるというね...

f:id:ts0818:20201222232421p:plain

 

何かWindows環境だと、

github.com

⇧「numpy 1.19.4」にバグがあるらしい...。

ワテのバージョンは、はい、「1.19.4」でした

f:id:ts0818:20201222232504p:plain

以下を実施で解決できるらしい。 

pip uninstall numpy
pip install numpy==1.19.3    

f:id:ts0818:20201222233847p:plain

f:id:ts0818:20201222233912p:plain 

f:id:ts0818:20201222233957p:plain

f:id:ts0818:20201222234021p:plain

f:id:ts0818:20201222234056p:plain

⇧「numpy 1.19.3」にダウングレードしたところ、

エラーなく実行できました。

f:id:ts0818:20201222234200p:plain

 

「scikit-learn」については、

scikit-learn.org

⇧ 公式にいろいろExampleが用意されてるので、試していきたいところですね。


というわけで、相変わらず、Visual Studio CodePython使う場合は、何やかんや設定が必要なんだな~、と思う今日この頃です。

Pythonで開発ってなった場合って実際の現場だと、JetBrainsが提供してるPython向けの「統合開発環境IDE:Integrated Development Environment)」である「PyCharm」とかを使ってるのかな?

モヤモヤ感しか残りませんな...

まぁ、何が言いたいかと言うと、Python有識者の方には、変数とかに型を指定するコーディングを広めていって欲しいですね。

やっぱりね、型があるのと無いのとだとコードの可読性が変わってくると思うし、型の指定がないコードを読むのは辛過ぎるので...

今回はこのへんで。