nikkie-ftnextの日記

イベントレポートや読書メモを発信

イベントレポート | #はんなりPython python3.9を語る LT会 に参加しました(2020年11月)

はじめに

この記事ははんなりPython Advent Calendar 2020 1日目の記事です。

頑張れば、何かがあるって、信じてる。nikkieです。
2020年10月にPython 3.9がリリースされましたね!
はんなりPythonで開催されたPython 3.9についてのLT会1でインプットしたことをまとめます。

目次

勉強会の概要

【オンライン】はんなりPython #34 python3.9を語る LT会 - connpass

はんなりPythonは毎月3週目の金曜日に行っています。

参加者同士の交流や情報交換がしやすいような雰囲気を作っています。
現役のエンジニアや女性エンジニア、プログラミング学習者など幅広い方々との出会いの場になってほしいです。

11月のはんなりPythonはLT会,テーマは「Python3.9」です。
LT時間は7分から14分です。

21時〜23時というちょっと遅い時間帯が特徴だと思っています。

勉強会の様子

この会をまとめた公式ブログはこちらです。

発表資料

共同編集 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さんによると、抽象構文木を学ぶには、書籍は以下がオススメだそうです:

新規モジュール graphlib のご紹介 molo21stさん

みんなのPython勉強会で私もお世話になっている辻さんのツイートをきっかけに触ってみたとのこと。

モジュールのソースコードまで踏み込んだ解説でとても分かりやすかったです。
裏で何が起こっているかつかめ、木のように見た時に根元の部分から並べていることが分かりました。

素人考えですが、組織図のようなものを一直線上に表す時に使えるかもと思いました。
スタッフなどで複数の役割を兼務しているケースに重宝しそうです。

import graphlib as gl

graph = {
    "低音": {"黄前", "田中"},
    "トランペット": {"中世古", "高坂"},
    "北宇治": {"低音", "トランペット"},
}

ts = gl.TopologicalSorter(graph)
print(tuple(ts.static_order()))
# ('田中', '黄前', '中世古', '高坂', '低音', 'トランペット', '北宇治')
# このタプルを逆順にすれば、組織図の上から幅優先でたどった感じになりますね

PidfdChildWatcherについて Yasshieeee(やっしー)さん

PidfdChildWatcher の紹介 + 並列処理周りの整理。
質疑タイムで発表内容への補強もあり、並列処理を使いこなせていない私はいくつも学びがありました

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さん

# 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会がありますよー!

登壇者、運営スタッフ、参加者、スポンサーの皆様、ありがとうございました。


  1. 私もPEP 585について登壇したのですが、登壇報告はまたの機会に。ref: https://twitter.com/ftnext/status/1329775771766771713?s=20

  2. リポジトリを見たら今はhark-langというそうです

  3. Pythonに対してややヤンデレな気もします