古の開発者、chatGPT先生に教えを乞いながらpythonを触ったボヤキ
仕事でpython君を触ることになりまして、初見の時の違和感や感覚は忘れてしまいそうなので、道中に思ったことやぼやきをメモしておきます。
特に知識を整理してある、とかではないです。むしろくだらないロートル開発者視点のぼやきです。笑えたら嬉しい。
理解が浅い点があることは重々承知してます。
なお、当方スペック、開発系なら静的言語(VB.NET、C#、Java)が主、次点でVBもどきの製品言語やJavaScript、あと初心者レベルのCやFortran、prologなども少しだけ。開発は…なんと10年近くぶりかもしれない。古のゆるゆる開発者です。
あとは契約やら運用やらなんでもやるので、開発だけではなく、そう言う運用に関する観点の話も混ざるかもしれません。
さて冒頭から。
◾️環境構築は比較的楽
まとまった資料を頂いて一人で構築。python自体は公式インストーラーが1番ベターと言うことで、サイトから落としてきてインスコ。
環境構築は特に詰まることはありませんでした。ただ、anaconda版とWindowsAPPstore版より公式インストーラー版がベターとか、そう言う細かい情報は現役の方がいた方がわかりやすいかもですね。ネットにも書いてなくもないけど。
道中エラーも出なくもないけど(特にvscodeとpath周り)、今はchat GPTさんに聞けばエラーの疑わしい場所を教えてくれます。
なんて便利なんだ。最高。
vscodeは初代入れてから放置してたので、拡張機能を大量に入れる仕様になってて、へえ…そうなんだ…便利(浦島) 日本語化、pythonのsupportも拡張パック扱い。
左端のメニューアイコンから積み木みたいなのを選び、それらしい単語で拡張機能を選ぶ。
なお、頼れる人がいない場合はここもchatGPTさんにオススメを聞くのがいいかもしれない。
◾️仮想環境とやらを作る
頂いた資料が指し示す通り、とりあえず言語仕様にある仮想環境をnenv構築してみる。
仮想環境は、所謂コンテナというより、ライブラリを切り替えるための仕様と理解。それは便利そう。
仮想環境を作るコマンドが成功すると、空だったprojectフォルダにワサワサとフォルダファイルが出来るのでビビる。フォルダ指定させろぉ。
なお、pythonインストーラーでチェック入れ忘れてpathが通らないままだと、venvはエラーなく空振りする。紛らわしい。
◾️とりあえず動かす
hello world.pyを作成。
こんなん↓
print('hello world')
import文等もなく、一行で動く。
この時点ではmain関数なくて動くのね謎の仕様ですねと誤認した。
vscodeで実行すると、Powershellが普通に起動してくる。pythonお前何PSでございみたいな動きすんねん(?)
とりあえず標準入出力はprintなのね&基本vscodeではPSで動かすのね、と言うのがわかった。
◾️言語仕様を試す
for 文やリストなどのアクセスを試したり、メソッドの動きを確認するなど、言語仕様の把握を行う。もっと癖のつよいイメージがあったが、IDEに入れた階層の整形機能やintellicenseが補完をしっかりしてくれるのでサクサクコーディングできる。シンタックスシュガーがすごい。何をしてるかわからんが(推測はできるけど)なんか動いてる。(所感)
サジェストやインタープリターのエラーが優秀で、型宣言する必要性が今のところない。テストコードなのもあり、突然変数が出てくる。
option explicitを書きたい。
ちょっと書き味がVBAっぽいと思ってしまうのは私だけかな…。
for文の階層は…まあ言語の癖だし別に構わない。個人的にはwith句を見た時にニッコリした。VB.net以来お会いしてませんでした。
メソッドの引数はデフォルトは参照渡しらしく、元の配列を処理途中でゴニョゴニョしたいときは注意。
その後、固定名の変数に突然*が導入されているところに行きついてしまい、Cなのかrailsなのか分からなくなる。タプルっていうらしい。集合演算のタプルですよね…お前唐突にDBとか関数型の顔してからじゃないの…
今回必要な知識は普通の手続き型言語の側面で良いはずなので、一旦今は見なかったことにして先に進む。
◾️ライブラリを探す&ヌルヌルコーディング
「CSV簡単にロードするためにはどのライブラリを入れればいいですか?あとサンプルコードください」などとchatGPTさんにお伺いし、必要なライブラリをガンガン入れてはテストコードを追加していく。
ライブラリは仮想環境単位で入れる必要があり、何を入れたかわからなくなった時にはpip list使えば一覧表示される。なんと便利。
CSVロードがオプション指定などが少なく、で、3行で出来た時は流石にドメイン言語か何かですか?真顔。
python君自体は基本インタープリターですし、早くないのは存じていました。調べた限りは他人が作ったライブラリを使う方が(中身がCとかだから)早いとのことで、探してどんどん入れる。
DBアクセスのライブラリを入れるのと、バリデーター、pydanticを入れるとDBアクセスするのと、入れるのとで30行とかくらい。だからドメイン言語かなんかなの??ってくらいサクサク処理出来る。
もちろんエラーでつまづくが、pythonの言語仕様を知らないためとかそういう話が殆ど。chat GPTさんがしっかりエラーを推測してくれた。
なるほどこれは開発効率が良い。だってほとんど効率がドメイン言語だもん。人気になるのもわかるなあ。
◾️サジェストとタイプヒント
諸々trycatch的なものを入れていったら流石にファットになりすぎた。
1ファイルを分割し、機能ごとに別ファイルにしようとしたところで、サジェストされないパターンが出てくる。
知らん言語ではIDEのサジェストは命綱のため、どうすればいいのかchat GPTさんに伺うと、タイプヒントを使えとの指示。
SQLのhint句みたいなやつ?を、型宣言のない引数に設定すると、型宣言しないけど渡される前提でIDEにサジェストされる。なるほど。returnもサジェストできるのね。
ついでに関数ヘッダー書くとサジェストで表示してくれるdocstringもこの時に把握。
自作クラスの配列を扱うサジェストをなんとか書いたが、いまだに配列周りは理解が怪しい。
◾️配列
これは私の備忘録。
配列は他の処理のノリで宣言しただけだとメモリが確保されないため、インデックスによるアクセスしようとしてこけます。あたりまえ体操だけど気がつくまでに時間がかかった。シンタックスシュガー多くて。
中身がなくても.append()使うと勝手に確保されるようなので追加のみ&速度の問題がない限りはappendが良さげ。
このまでもろもろコードを書いてきましたが、「構造化言語ベースで書いていいよ〜」との事だったので構造化言語としての仕様を知るために書いてました。
実際何も考えずに初心者が作ると構造化言語として書いてしまうだろうな〜という程度にはオブジェクト指向なくても充分にワークします。
ただ、個人的にいくつかの使いたいライブラリがクラスを前提としていることに気が付いてしまいました。それからタプルの存在にも。。
それなりに使えるようになるには、どうやらOOPと関数型言語のエッセンスは必要みたいです。
その後python君のクラスの取り扱いには何故かめちゃくちゃ苦戦しましたが、それは後日別に書きます。タプルは必要になったら…やるかな…。
てか…私は…年の功でなんとかするけど、初心者生きてる?という気持ち。ここからいきなり入るの??大変じゃない?
◾️__main__とか__init__とかthis
Rail on rails(死語かな)みたいな発想で妙に思い切りのいい謎の仕様。何故アンスコ…文字列…
他はなんとなくでもコーディングできちゃうのに、初見で誰が理解できるんだよこの仕様を。
時間が取れたら続きます。