蛇使いな彼女BLOG
【第100回】クラスオブジェクトの条件分岐とmatch caseに関して②
2024.03.01
前回の続きです。
が!VisualStudioのサポート不具合でせっかく①で作成したpy310の環境でmatchが使えない事が発覚しました💔
後に詳しく説明しますが、Jupyterで代用できたので、まずはあらかじめつくっておいたカーネル(仮想環境)に切り替えてmatchを使ってみます。
以下はJupyterNotebookで実行したスクリプトと結果をhtmlで出力したものです。
JupyterはVSと違いWEB上で動くシステムなので、何もしていない状態だとsavefigなどローカル環境への自動保存ができません。参照と共有は出来ますが単発じゃないと面倒(笑)なので、若干コードを作り替えています。
import sys
import numpy as np
#import matplotlib.pyplot as plt
#python version
print(sys.version)
r=np.random.default_rng()
data=r.uniform(0,200,(25,100))
np.arange(10)
class Data_selection():
def __init__(self,d=data,):
self.d=d
def search(self,num=0):
#1行目を整数に丸めてnumと一致する列を返す
col=np.where(np.round(data[0,:],0)==num)[0]
res=data[:,col]
return res
Ds=Data_selection()
for i in range(10):
item=Ds.search(num=i)
match item.shape:
case (25,0):
print('ZeroDivisionError')
case (25,1):
print('1 hit')
case _:
print('multiple hits')
#fig,ax = plt.subplots(figsize=(3, 3))
#ax.plot(item)
#fig.savefig('fig/Number_{}.png'.format(i))
#plt.close()
3.11.0 | packaged by conda-forge | (main, Oct 25 2022, 06:12:32) [MSC v.1929 64 bit (AMD64)] 1 hit ZeroDivisionError 1 hit ZeroDivisionError ZeroDivisionError ZeroDivisionError ZeroDivisionError multiple hits ZeroDivisionError multiple hits
変数itemの列数によって処理を変えていますが、ちゃんと結果に反映されていますよね!
構文としてはScalaやC言語に採用されているパターンマッチのようですが、if文と何が違うかというと「match 対象:」と最初に明示しないといけない為コード行3桁以上の大きなプロジェクトでは後から管理しやすいです。
ただ、ifと違って演算は出来ない点に注意です。
さて、無事検証できたところでVisualStudioの不具合について説明しておきます。
前回の①で作った仮想環境py310(Python3.10)ですが、いつものようにVisualStudio2019から仮想環境へ切り替えてmatchを実行した場合、SyntaxErrorとなりました。そのあとPython3.11に変えて同じように試しましたが上手くいかず。メニュー下には警告が出ていました。
初めは構文ミスかバージョンミスかと思って何度かトライしていたんですが、どうやらVisualStudioはPython3.8からサポートしていないのが原因のようです!
後からインストールしたVisualStudio2022で試してもダメで、Jupyterに変えたら普通に動きました😵
これかなりの死活問題ですよね・・・。VS使いやすくて気に入っていたのですが、新しく出た構文とかパッケージに対応してない物があるのかあ~。
マイクロソフトさんがんばって!!