はじめに
この記事ははんなりPython Advent Calendar 2020 1日目の記事です。
頑張れば、何かがあるって、信じてる。nikkieです。
2020年10月にPython 3.9がリリースされましたね!
はんなりPythonで開催されたPython 3.9についてのLT会1でインプットしたことをまとめます。
目次
- はじめに
- 目次
- 勉強会の概要
- 勉強会の様子
- What's New in Python3.9を読む hide ogawaさん
- 3.9 で追加された ast モジュールの新機能 ast.unparse t2yさん
- 新規モジュール graphlib のご紹介 molo21stさん
- PidfdChildWatcherについて Yasshieeee(やっしー)さん
- zoneinfoを使おう hrsano645さん
- 感想
- 終わりに
勉強会の概要
【オンライン】はんなりPython #34 python3.9を語る LT会 - connpass
はんなりPythonは毎月3週目の金曜日に行っています。
参加者同士の交流や情報交換がしやすいような雰囲気を作っています。
現役のエンジニアや女性エンジニア、プログラミング学習者など幅広い方々との出会いの場になってほしいです。11月のはんなりPythonはLT会,テーマは「Python3.9」です。
LT時間は7分から14分です。
21時〜23時というちょっと遅い時間帯が特徴だと思っています。
勉強会の様子
この会をまとめた公式ブログはこちらです。
発表資料
#はんなりPython zoneinfoの話(タイムゾーン)でした。ナイーブをネイティブと間違えていたので今から直します😅https://t.co/XZygcv52ao
— Hiroshi Sano (@hrs_sano645) 2020年11月20日
共同編集 Scrapbox
What's New in Python3.9を読む hide ogawaさん
変更点の概要(What's New)をdeepnoteで編集・実行可能な形式でまとめた発表。
触って気になるところの理解を深められるのがいいですね!
deepnote初めてでしたが、これで共同編集できるとなると、話題になるのも納得でした。
3.9 で追加された ast モジュールの新機能 ast.unparse t2yさん
ast.unparse
(ドキュメント)で抽象構文木からソースコードに戻せるようになったそうです。
ソースコード→抽象構文木(AST)→ソースコードができる!
デモで、抽象構文木を加工してソースコードを書き換えていて、私はおおっ!と興奮しました。
プログラミング言語の抽象構文木に興味を持ったのは以下の記事です。
「a = 2
といったコードはもっと深く理解できるんだ。知りたい!」とワクワクしました。
hyというDSLの例では、今年PyCon Africaで聞いたteal-lang2を思い出しました。
どう作ったのか気になってましたが、抽象構文木を操作すれば作れるんですね。
t2yさんによると、抽象構文木を学ぶには、書籍は以下がオススメだそうです:
Pythonハッカーガイドブック (Compass Booksシリーズ)
- 作者:Julien Danjou
- 発売日: 2020/05/29
- メディア: Kindle版
新規モジュール graphlib のご紹介 molo21stさん
みんなのPython勉強会で私もお世話になっている辻さんのツイートをきっかけに触ってみたとのこと。
Python3.9から新たに標準モジュールでgraphlibが加わりトポロジカルソートができるようになったの、個人的にはビッグニュースだな。https://t.co/Sl8S2yezxp
— 辻真吾 (@tsjshg) 2020年10月12日
モジュールのソースコードまで踏み込んだ解説でとても分かりやすかったです。
裏で何が起こっているかつかめ、木のように見た時に根元の部分から並べていることが分かりました。
素人考えですが、組織図のようなものを一直線上に表す時に使えるかもと思いました。
スタッフなどで複数の役割を兼務しているケースに重宝しそうです。
import graphlib as gl graph = { "低音": {"黄前", "田中"}, "トランペット": {"中世古", "高坂"}, "北宇治": {"低音", "トランペット"}, } ts = gl.TopologicalSorter(graph) print(tuple(ts.static_order())) # ('田中', '黄前', '中世古', '高坂', '低音', 'トランペット', '北宇治') # このタプルを逆順にすれば、組織図の上から幅優先でたどった感じになりますね
PidfdChildWatcherについて Yasshieeee(やっしー)さん
PidfdChildWatcher の紹介 + 並列処理周りの整理。
質疑タイムで発表内容への補強もあり、並列処理を使いこなせていない私はいくつも学びがありました
- Pythonではマルチスレッドにしても実行されるスレッドは1つ(GIL)
- multiprocessing
- asyncio
multiprocessingの例(記憶を元に、またドキュメントを参考に)
import time from multiprocessing import Process def f(num): print("start", num) time.sleep(2) print("end", num) if __name__ == "__main__": p1 = Process(target=f, args=(1,)) p2 = Process(target=f, args=(2,)) p1.start() p2.start() # start 1 # start 2 # end 2 # 以下は2秒後に表示 # end 1
asyncioの例(記憶を元に、またドキュメントを参考に)
import asyncio async def f(num): print("start", num) await asyncio.sleep(2) print("end", num) async def main(): await asyncio.gather(f(3), f(5)) if __name__ == "__main__": asyncio.run(main()) # start 3 # start 5 # end 3 # 以下は2秒後に表示 # end 5
zoneinfoを使おう hrsano645さん
- Python3.8まではオフセットをdatetime.timedeltaで指定したdatetime.timezone(やや使いづらい)
- Python3.9からはzoneinfoモジュール!
# Python 3.9.0で確認 # Python 3.8まで >>> from datetime import datetime, timedelta, timezone >>> jst_tz = timezone(timedelta(hours=9)) >>> d1 = datetime(2020, 10, 31, 12, tzinfo=jst_tz) # Python 3.9から >>> from zoneinfo import ZoneInfo >>> d2 = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("Asia/Tokyo")) # どちらの作り方でも等しい >>> d1 == d2 True
datetime.datetime.now()
(ドキュメント)はタイムゾーン指定なしではnaiveなローカル日時が紛らわしいは同意ですし、
これがnaiveなせいでawareなdatetimeと差を取ろうとしてエラーというのもあるあるです。
感想
Python自体について色々と知られて、楽しかった!これに尽きます。
みんなのPython勉強会やPyCon JPはスタッフとして参加なので、なかなかインプット全集中しにくいところがあります(運営タスクが脱集中してくるのです)。
参加者として参加すると、インプットに集中できるのが新鮮ですね。
また、Pythonを始めてそろそろ3年ですが、「Pythonのことは何でも知りたい!」とドキュメントをひたすら引いています3。
そんな私にはPython 3.9縛りのLTはどれも聴きごたえがあり、とても楽しめました!
終わりに
はんなりPythonさんは第3金曜日以外も精力的に(週1ペース!で)勉強会を開催されているので、「これは!」と思うものがあったら、ぜひぜひ飛び込んでみてはいかがでしょうか。
12月はKaggle部や年末LT会がありますよー!
登壇者、運営スタッフ、参加者、スポンサーの皆様、ありがとうございました。