概要
pythonの超初心者が、pyLadiesに参加させていただきました🐈ྀི
内容は、「Python3.12の新機能を研究しましょう!」
まず、Pythonを触った程度の私がわかるかな・・・と思っていたのですが、皆さんが取っ掛かりやすいテーマにしてくださり、理解できたかと思います。
間違っている可能性も高いので、お手数ですが見つけた方はご指摘いただけると幸いです。
イベントページ
↓
https://pyladies-tokyo.connpass.com/event/298770/
今回新しく機能追加されたものの一覧
(検索の仕方は「Pyhotn3.12 psf サマリー」です)
↓
https://docs.python.org/ja/3/contents.html
この記事は、ハンズオンでしてくださるとわかりやすいと思いますので、Python3.12のインストールの仕方も載せておきます。(当方がMacなので、Macのしか載っていません。)
↓
https://blog.pyq.jp/entry/python_install_231102_mac
今回深掘りしたテーマ
今回私たちが深掘りしたテーマは、PEP 709: Comprehension inliningです。
内容としては、error messageの改善が加わったとのこと。
早速、どんな改善が加わったのか確認してみましょう!
今回は、error messageの確認を行うため意図的に間違ったコードを書きます。
Pythonのversionごとにどんなerrorが、出るのかを見比べます。
まずは、ImportErrorを出します。
ImportError exceptions raised from failed from import
statements now include suggestions for the value of based on the available names in .
(Contributed by Pablo Galindo in gh-91058.)
(gh-91058が改善時のGitHubに飛べる)
Python3.10
>>> from collections import chainmap
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'chainmap' from 'collections' (/Users/kashiwagirena/.pyenv/versions/3.10.4/lib/python3.10/collections/__init__.py)
Python3.12
>>> from collections import chainmap
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'chainmap' from 'collections' (/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/collections/__init__.py).
Did you mean: 'ChainMap'? # ←ここに、サジェスティングが出るようになった様子👀
Did you mean: 'ChainMap'?
Python3.12は、「'ChainMap'という意味ですか?」って、こちらに提案をしてくれています。
次は、SyntaxErrorを出します。
Improve the SyntaxError error message when the user types import x from y instead of from y import x. (Contributed by Pablo Galindo in gh-98931.)
(gh-98931が改善時のGitHubに飛べる)
Python3.10
>>> import a.y.z from b.y.z
File "<stdin>", line 1
import a.y.z from b.y.z
^^^^
SyntaxError: invalid syntax
Python3.12
>>> import a.y.z from b.y.z
File "<stdin>", line 1
import a.y.z from b.y.z
^^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: Did you mean to use 'from ... import ...' instead? # ←ここに、詳しくサジェスティングが出るようになった様子👀
Did you mean to use 'from ... import ...' instead?
Python3.12は、「'from ... import ...'じゃないですか?」って、こちらに提案をしてくれています。
次は、NameErrorを出します。
Improve the error suggestion for NameError exceptions for instances. Now if a NameError is raised in a method and the instance has an attribute that's exactly equal to the name in the exception, the suggestion will include self. instead of the closest match in the method scope. (Contributed by Pablo Galindo in gh-99139.)
(gh-99139が改善時のGitHubに飛べる)
Python3.10
>>> sys.version_info
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined
Python3.12
>>> sys.version_info
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined.
Did you forget to import 'sys'? # ←ここに、サジェスティングが出るようになった様子👀
Did you forget to import 'sys'?
Python3.12は、「'sys'のimport忘れてませんか?」って、こちらに提案をしてくれています。
Python3.10では、かなりあっさりとしたerror messageであることで、初学者の私にはヒントが数ないイメージです。ですので、ちゃんと調べないと、原因究明が出来なさそうです。
Python3.12では、改善点のサジェスティングで原因がかなり絞り込め、調べるのも容易に出来そうです。
ます動くようにして、次に原因究明の順でできそうなので心に余裕が生まれそうです!
より深い話
今回、Python3.10とPython3.12を比べることで、具体的に改善を確認することができました!
では、なぜこのような改善が今回行われたのでしょうか?
理由は、2点あるようでした!
1,Python3.10の際に、このerror messageの改善の話が出たようなのですが、多くの改善が必要だったようで、却下されました。(参考文献:https://bugs.python.org/issue46902)
今回、(詳しく説明できないのですが、)Pythonの中身の変更があったようで、実装する方法が見つかり改善を行ったようです。
2,Javaには、もうこのerror messageの改善がversion9あたりに行われてたようで、「Javaにはあるのに、なんでPythonにはないの?」みたいな話が出たそうです。
(初学者がスライトを見た際の記憶で書いています。もし、勘違い等している際はお手数ですが、指摘してくださると幸いです🙇♀️)
まとめ
今回、なぜ改善がなされたのか、開発者がその際にどんな話をして、何を考えて開発しているのかを少し垣間見ることができました。(GitHubおもろい✨)
そこまで、知ると見える世界がかなり変わり、プログラミング言語がより人間味を出してくれて取っ付きやすく感じました。
改善点の例文コードがあるものは、実際に自分でコードを打ち確認することでより理解することができました。(全てに当てはまると思うので、積極的にハンズオンしなければ・・・と改めて理解!)
今回のテーマの内容が、初学者である私がRuby等と比べてerror messageが読みにくいなと感じている一要因だったことも、理解が早い要因だった様子です。
言語ごとに違いがあり楽しいと思っているので、今後も深掘りをできる範囲で行い、より深い理解をできるようになりたいです。(あくまでも、希望論です!!!)
なお、気がついている方がいるかもしれませんが、
今回のこの改善。VSCode等のコードエディターを使っていると、エディター自体が打っている最中に教えてくれます。
ですので、「私のような初学者か、ターミナル等を使って開発しておられる方向けとなっているのではないか。」ということでした!