Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Python3.10の新機能 (まとめ)

はじめに

Python 3.5から What's Newの内容をまとめる記事を投稿してきました。

リリースサイクルが1年になり、この前3.9が出たばかりと思ったらもう3.10のa2が出ていました(汗)。ここで書いているように、正式版がでるのと同時に次のα版がでるのでまあ予定通りなのですが、ちょっとペースが早い (^^;

それでもやはり次のリリースで何が載ってくるのかは気になるので抜粋してまとめていきたいと思います。なお、3.9の次のバージョンは4.0ではなく3.10です(笑)。まずはいつもの開発ロードマップ(PEP-619)。

  • 3.10.0 開発開始: 2020-05-18 (完了)
  • 3.10.0 alpha 1: 2020-10-05 (完了)
  • 3.10.0 alpha 2: 2020-11-02 -> 2020-11-04 (完了)
  • 3.10.0 alpha 3: 2020-12-07 (完了)
  • 3.10.0 alpha 4: 2021-01-04 (完了)
  • 3.10.0 alpha 5: 2021-02-01
  • 3.10.0 alpha 6: 2021-03-01
  • 3.10.0 alpha 7: 2021-04-05
  • 3.10.0 beta 1: 2021-05-03
  • 3.10.0 beta 2: 2021-05-25
  • 3.10.0 beta 3: 2021-06-17
  • 3.10.0 beta 4: 2021-07-10
  • 3.10.0 candidate 1: 2021-08-02
  • 3.10.0 candidate 2: 2021-09-06 (必要であれば)
  • 3.10.0 final: 2021-10-04

予定通りに行けば3.9からちょうど1年後の2021年10月に3.10がでます。

更新履歴

2021-01-24

  • 2021-01-04にリリースされた 3.10 alpha 4をベースに改定しました。
    • 廃止予定に PEP-623 (Unicode内部実装関連)を追加
    • 「PEP-612: 引数仕様変数」に関して別記事に書き、それへのリンクを追加しました

2020-11-07

  • 最初のバージョン。a2が 2020-10-04にリリースされましたが、そのwhat's new をベースに書いています。

注目した新しい機能

PEP 563: アノテーションの遅延評価がデフォルトになる

Python-3.7の新機能として「アノテーションの評価を遅らせる」というのを紹介しましたが、その動作がデフォルトになりました。つまり、これまでは遅延評価を有効にするには

from __future__ import annotations

というimport文を入れる必要がありましたが、3.10からはその必要がなくなります。3.7の時には「Python-4.0で標準になる」と書かれていましたが、3.10でしたね。

そして型アノテーション系の機能が幾つか変わっています。一つは inspect.signatureの動作で、これまでは型の文字列表現を返していたのを型そのものを返すようになります。例えば以下のコードで関数のパラメータの型を表示しようとした場合、

from __future__ import annotations
import inspect

def func_a(a: int, b: list, c: C):
    pass

class C:
    pass

sig = inspect.signature(func_a)

for (name, param) in sig.parameters.items():
    print(name, repr(param.annotation))

Python-3.9以前だと

a 'int'
b 'list'
c 'C'

のように文字列が返ってきますが、python-3.10からは

a <class 'int'>
b <class 'list'>
c <class '__main__.C'>

という形で型のクラスオブジェクトが返ってくるようになります。仮に class Cが見つからなかった場合にはこれまで通り文字列の'C'が返ってきます。

PEP 613: 型エイリアスのアノテーション

PEP 484で型エイリアス(型に別名をつける)が導入されましたが、トップレベルでの代入式で表現されるので通常の変数への代入と見分けがつきにくいという問題がありました。型エイリアスであることを明確にするためにTypeAliasというアノテーションが追加されます。

例えばこれまでは

IntType = int   

と書いていたものが

IntType: TypeAlias = int

という風に書けるようになります。

PEP 604: 共用体型オペレータ

これまた型関係の変更ですが、2つ以上の型を取る変数の型アノテーションをする場合、これまでは

number: Union[int, float]

と書かなければならなかったところが

number: int | float

と書けるようになります。TypeScriptなどでも使われている記法を取り入れた感じですね。

PEP-612: 引数仕様変数

→ 別記事にしました: Python3.10の新機能(1) - 引数仕様変数 (Parameter Specification Variables)

PEP 618: zip関数の追加パラメータ

zip()関数にstricというパラメータが追加され、これがTrueの時にはzipする2つのイテラブルが同じ長さであることをチェックします。長さが違う場合には ValueError例外が送出されます。

その他の言語の変更

  • int型の変数にbit_count()というメソッドが追加されました。これは整数の数値をバイナリ表現した場合の1の数を返すというものです。これは、Population Count (or pop count)という呼び方もされるようですが、基本は bin(a).count('1')とやっていることは同じで、より高速に処理ができるようになったということのようです。

  • 辞書型のメソッド keys()values()items()が返すビューオブジェクトにmappingという属性が追加され、元の辞書型データへアクセスできるようになりました。

  • DecimalおよびFractionは整数引数の値として使えなくなります。例えば以下のようなコードは Python-3.9.では DeprecationWarningが出されていましたが、python-3.10からエラーになります。

  from decimal import Decimal
  i = Decimal(97)
  print(chr(i))

新規に追加されたモジュール

(まだなし)

モジュールの改善

base64

RFC-4648で定義されている拡張Hexアルファベットをサポートするためにbase64.b43hexencode()base64.b43hexdecode()が追加されました。通常のBase32のアルファベットは他の文字との見た目が似ている '0'と'1'を使わないようになっているのですが、この拡張Hexアルファベットではそれらは使用されていて、代わりにマッピングされた文字がソート順になっているという特徴があります(それで何が嬉しいのかは謎ですが)

curses

ncurses 6.1 で導入された拡張カラーを使うことができるようになります。Pythonから利用しているncursesライブラリがこれをサポートしているかどうかは curses.has_extended_color_support()で確認することができます。

glob

glob()iglob()root_dirdir_fdパラメータが追加され、ファイル検索のルートディレクトリを指定できるようになりました。前者はパス風オブジェクトで、後者はルートディレクトリのファイルディスクリプタを指定します。

types

types.EllipsisTypetypes.NoneTypetypes.NotImplementedTypeが(再)導入されました。

最適化

  • str() bytes() bytesarray()が速くなりました(小さなオブジェクトの場合30-40%)
  • runpyモジュールがインポートするモジュールの数が少なくなり、python -m モジュール名で実行した場合に起動時間が平均で 1.3倍速くなりました

廃止予定

  • このバージョンから、python2.7との互換性のために残されていた古いインポート方法が廃止予定になります。
  • find_loader()find_module()load_module()__package__属性、__loader__属性は将来のバージョンで消去されます。
  • Unicodeの内部実装に手が入り、PEP-393で導入されたC言語のAPIとそれらのAPIで使われていたunicodeオブジェクト内のデータが廃止予定になります。元々はPython 4.0で削除予定でしたが、4.0のスケジュールが立っていないため、3.12で削除することになりました。これによって文字列一つあたり8バイトの節約になりAPI呼び出時のオーバーヘッドも削減できます (PEP-623)

機能削除

  • complex クラスの__int__, __float__, __floordiv__, __mod__, __divmod__, __rfloordiv__, __rmod__ , __rdivmod__メソッドが消去されました。

まとめ

Python 3.10の変更点についてまとめてみました。だいぶ機能が出揃ってきたようですが、まだa4リリースで仕様がFixするb1まであと3ヶ月あります。これからも変更が入ってくると思うので、追いかけていきたいと思います。

caddi
製造業の受発注プラットフォーム「CADDi」を提供しています。 モノづくりに携わるすべての人が、本来持っている力を最大限に発揮できる社会を実現する。産業の常識を変える「新たな仕組み」をつくります。 「CADDi」は金属加工品のCAD・設計図の解析から複雑な物流を表現するUIまで幅広い開発をしており、常に開発環境に最新の技術をとり入れて、より良いプロダクトを作るように心がけております。
https://corp.caddi.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away