Pythonの現在とこれからと

Takanori Suzuki

<OSS X Users Meeting> #31 / 2021 Aug 25

今日話すこと 🗣

  • Pythonとは

  • Pythonの旬なプロジェクト

  • Python開発の歴史

  • Python言語アップデート

  • Pythonの未来

スクショ 📸 ツイート 🐦 👍

@takanory

スライド 💻

👉 slides.takanory.net

最初に質問

Python知ってる人 🙋‍♂️

Python使ったことある人 🙋‍♀️

Python今使っている人 🙋‍♂️

Who am I(お前誰よ) 👤

../_images/sokidan-square.jpg

Pythonとは 🐍

Pythonとは 🐍

  • 汎用のプログラミング言語

    • 動的型付け

  • 1991年に0.9がリリース

  • 最新バージョンは 3.9.6

  • Python 2系は2020年1月1日にEOL

読みやすい構文

for num in range(1, 101):
    if num % 15 == 0:
        print('FizzBuzz')
    elif num % 5 == 0:
        print('Fizz')
    elif num % 3 == 0:
        print('Buzz')
    else:
        print(num)

後方互換性

  • 3.9で書いたプログラム→基本3.10で動く

  • 利用するサードパーティライブラリ次第(後述)

  • Python 2系→3系では後方互換性を犠牲に

    • 移行にかなりかかった

Pythonリリースの歴史

../_images/history.png

豊富な標準ライブラリ

  • 標準ライブラリでいろいろできる

  • バッテリー同梱 とも言われる

  • ただ多すぎて使われてなさそうなものも…

  • 公式ドキュメント: Python 標準ライブラリ

豊富なサードパーティライブラリ

  • PyPI (パイピーアイ)からインストール

    • $ pip install パッケージ名

PyPI

豊富なサードパーティライブラリ

  • Webフレームワーク、スクレイピング

  • 行列計算、機械学習、深層学習

  • コンピュータービジョン、画像処理

  • データ分析、可視化

  • などなど

豊富なサードパーティライブラリ

Awesome Python

他のツールの組み込み言語

  • 3DCG

    • blender, Mayaなど

  • ゲームエンジン

    • Unreal Engine

Pythonとは 🐍 - まとめ

  • 読みやすい構文

  • 後方互換性を維持

  • 豊富な標準ライブラリ、サードパーティライブラリ

Pythonの旬なプロジェクト 🔥

  • 旬っぽいプロジェクトをいくつか紹介

FastAPI

../_images/fastapi.png

JupyterLab

../_images/jupyterlab.png

PyCaret

../_images/pycaret.png

AWS CLI / Google Cloud SDK

Black

../_images/black.png

Poetry

../_images/poetry.png

Pythonの旬なプロジェクト 🔥 - まとめ

  • 気になるものがあったら試してみて

  • FastAPI

  • JupyterLab

  • PyCaret

  • AWSCLI / Google Cloud SDK

  • Black

  • Poetry

Python開発の歴史 🕰

Pythonの拡張はPEPで提案

  • PEP: Python Enhancement Proposal

  • 2000年頃から運用

    • PEPを書いて提案

    • メーリングリストで議論

    • 最後に採用/不採用を判断

  • PEP 1 – PEP Purpose and Guidelines

BDFL: 優しい終身の独裁者

  • BDFL が採用/不採用を最終決定

    • BDFL = Guido van Rossum

    • BDFL Delegatesで他の人に判断を委譲可能

Guido van Rossum

BDFLの引退

../_images/transfer-of-power.png

Pythonの新しい運営モデル

The Steering Council Model

  • 毎年5名のCouncil membersを投票で決める

  • Council membersがPEPの採用/不採用を決定

  • 2019年はGuidoがいたが、2020以降は立候補していない

  • 投票結果: 2019(PEP 8100), 2020(PEP 8101), 2021(PEP 8102)

2021 Council member

P.Galindo Salgado, B.Cannon, T.Wouters

C.Willing, B.Warsaw

../_images/council.png

Python Steering CouncilのKeynote

Python開発の歴史 🕰 - まとめ

  • 2018年に大きく運営方針が変わった

  • 今後も継続的に開発は続きそう

  • Council Modelへの移行はいいタイミングだったかも

宣伝 📺

  • ここで休憩がてらコミュニティ活動の宣伝

PyCon JP

  • 国内最大のPythonイベント(2021.pycon.jp)

  • 2021年10月15日(金)、16日(土)

../_images/pyconjp.png

PyCon JP TV

  • Pythonについて月1ライブ配信(tv.pycon.jp)

  • 次回は2021年9月3日(金)

../_images/pyconjptv.png

Python Boot Camp

../_images/pycamp.png

Python Charity Talks in Japan

../_images/pycharity.png

宣伝ここまで

  • 興味があるものに参加してみてください

Python言語アップデート 🆕

Python言語アップデート 🆕

最近の主な新機能

  • 3.6: フォーマット済み文字列リテラル

  • 3.7: データクラス

  • 3.8: 代入式

  • 3.9: 辞書の和集合演算子

3.6: フォーマット済み文字列リテラル

  • f-string ともいう

  • f'{式}や{式:書式}'

>>> name = 'たかのり'
>>> power = 530000
>>> f'{name}の戦闘力は{power:,}'  # f-string
'たかのりの戦闘力は530,000'
>>> '{}の戦闘力は{:,}'.format(name, power)  # それ以前

3.7: データクラス

  • @dataclass デコレーターで作れる

@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0

p = Point(1.5, 2.5)
print(p)  # "Point(x=1.5, y=2.5, z=0.0)"

3.8: 代入式

  • := 演算子: 変数に値を入れて、その値を返す

  • 別名: セイウチ演算子 (Walrus Operator)

name = 'じゅげむじゅげむごこうのすりきれ'
if (n := len(name)) > 10:
    print(f"名前が長すぎます({n}文字)")

# それ以前
if (len(name)) > 10:
    print(f"名前が長すぎます({len(name)}文字)")

3.9: 辞書の和集合演算子

  • 辞書のマージ(|)と更新(|=)演算子

>>> x = {"key1": "v1/x", "key2": "v2/x"}
>>> y = {"key2": "v2/y", "key3": "v3/y"}
>>> x | y
{'key1': 'v1/x', 'key2': 'v2/y', 'key3': 'v3/y'}
>>> y | x
{'key2': 'v2/x', 'key3': 'v3/y', 'key1': 'v1/x'}
>>>
>>> {**x, **y}  # それ以前
{'key1': 'v1/x', 'key2': 'v2/y', 'key3': 'v3/y'}

型ヒント

  • 動的型付け言語だが 型ヒント が付けられる

  • mypy などのツールで静的チェック

  • ヒントなので実行時は評価されない

def greeting(name: str) -> str:
    # name: str で引数nameの型が文字列
    # -> str で返り値が文字列
    return 'Hello ' + name

型ヒント - なにが嬉しいの?

  • 型安全なプログラムになる

    • 大規模プロジェクトなどで有効

  • APIドキュメントに型情報が入る

  • エディターが型ヒントをもとに教えてくれる

VS Codeでの型ヒントの使用例

型ヒント - 発展中

  • 徐々に書き方が便利になってきている

  • from __future__ import annotations で最新(3.10)の書き方ができる

# Python 3.10からこう書ける
def square(number: int | float) -> int | float:
    return number ** 2

# それ以前
from typing import Union

def square(number: Union[int, float]) -> Union[int, float]:
    return number ** 2

型ヒント - 参考資料

Python 3.10の主な新機能

Better error messages

  • エラーメッセージがわかりやすくなった

>>> if name = 'takanori':  # Python 3.9以前
  File "<stdin>", line 1
    if name = 'takanori':
            ^
SyntaxError: invalid syntax
>>> if name = 'takanori':  # Python 3.10
  File "<stdin>", line 1
    if name = 'takanori':
       ^^^^^^^^^^^^^^^^^
SyntaxError: invalid syntax. Maybe you meant '==' or ':='
instead of '='?
  • 「たぶん、 = ではなく ==:= の意味では?」

Better error messages

  • IndentationErrorもわかりやすく

>>> for i in range(10):  # Python 3.9以前
... print(i)
  File "<stdin>", line 2
    print(i)
    ^
IndentationError: expected an indented block
>>> for i in range(10):  # Python 3.10
... print(i)
  File "<stdin>", line 2
    print(i)
    ^
IndentationError: expected an indented block after 'for'
statement on line 1
  • 「1行目の for のあとにインデントが必要」

Structural Pattern Matching

  • match 文と case 文でいずれかのパターンにマッチ

match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _:
        <action_wildcard>

Structural Pattern Matching

  • シンプルなリテラルにマッチ

def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 401 | 403 | 404:  # or
            return "Not allowed"
        case 418:
            return "I'm a teapot"
        case _:  # ワイルドカード
            return "Something's wrong with the Internet"

Structural Pattern Matching

  • (x, y) のタプルの値でマッチ

match point:
    case (0, 0):
        print("Origin")
    case (0, y):
        print(f"Y={y}")
    case (x, 0):
        print(f"X={x}")
    case (x, y):
        print(f"X={x}, Y={y}")
    case _:
        raise ValueError("Not a point")

Structural Pattern Matching

  • インスタンスの型でマッチ

def dump(node: Node) -> str:
    match node:
        case Assignment(target, value):
            return f"{target} = {dump(value)}"
        case Print(value):
            return f"print({dump(value)})"
        case Operation(left, op, right):
            return f"({dump(left)} {op} {dump(right)})"

Structural Pattern Matching - 参考情報

Structural Pattern Matching - 参考情報

Python言語アップデート 🆕 - まとめ

  • 最近はあまり大きい変更はなかった

  • Better error messagesで初心者に優しく

  • Structural Pattern Matchingは注目の機能追加

Pythonの未来 🚀

Python 4はいつ出るの?

  • 現在その計画はなく3.11, 3.12…と続く

  • 3から4への移行は、2から3のようにはしない

Pythonの高速化

The “Shannon Plan”

Microsoftのサポート

  • Guido氏はDropboxを去って引退

  • しかしパンデミックで家にいてつまらない

  • Microsoftに応募して採用された

  • 自由にプロジェクトが選べる

  • Pythonの高速化を進める

faster-cpythonリポジトリ

Pythonの未来 🚀 - まとめ

  • Python 3系がしばらく続きそう

  • Pythonの高速化に注目

まとめ

  • Pythonリリースから30年ほど経過

  • 色々あったが運営の体制は維持されている

  • 現在も少しずつ改良されている

  • 今後は高速化にも期待

Thank you 🙏

>>> import __hello__
Hello world!