Python3.11の新機能 Python 3.11の新機能(その11) 標準ライブラリ

(その1) CPython高速化計画(その2) 特殊化適応的インタープリタ(その3) 関数呼び出しのインライン化(その4) 例外グループとTaskGroup(その5) PEP-646 可変長ジェネリックス(その6) PEP-673 Self型(その7) PEP-681 データクラス変換(その8) PEP-655 TypedDictの要素ごとに省略可・不可を指定する(その9) その他の型ヒント関連機能(その10) 正規表現 - アトミックグループとPossessive指定子(その11) 標準ライブラリ(その12) Python本体の機能追加

Python 3.11でも、標準ライブラリにたくさんの改善が行われました。すべてを紹介することはできませんが、気になった修正を解説します。

PEP 680: tomllib

TOML フォーマットを読み込むモジュール tomllib が追加されました。

In [20]:
import tomllib
tomllib.loads("""
[secion]
option = "OPTION"
list = [1, 2, 3]
date = 2022-10-19T00:00:00Z
""")
Out[20]:
{'secion': {'option': 'OPTION',
  'list': [1, 2, 3],
  'date': datetime.datetime(2022, 10, 19, 0, 0, tzinfo=datetime.timezone.utc)}}

datetime.UTC

datetimeモジュールには、国際標準時(UTC)を表すtimezoneオブジェクト timezone.utc が登録されており、タイムゾーンがUTCの datetime オブジェクトを作成する場合などに利用できます。

In [7]:
import datetime
datetime.datetime.now(tz=datetime.timezone.utc)
Out[7]:
datetime.datetime(2022, 10, 19, 11, 3, 19, 652138, tzinfo=datetime.timezone.utc)

しかし、datetime.timezone.utc という名前がいまいちでした。いちいちタイプするのは文字数が多くて面倒だし、ソースコードを80カラム以内に収めるのが大変です。

from datetime.timezine import utc としたいところですが、datetimeはパッケージではないためこれもできません。utc = datetime.timezone.utc なら書けますが、あまり標準的な使い方とは言えません。

Python3.11では datetime.UTC が追加され、

datetime.datetime.now(tz=datetime.UTC)

と短く書けるようになりました。datetime.UTC はモジュールのトップレベルに追加されましたので、シンプルに

from datetime import UTC
datetime.datetime.now(tz=UTC)

とも書けます。

datetime.fromisoformat()がタイムゾーン指定 Z をサポート

datetime.fromisoformat() は、次のような文字列から datetimeオブジェクト を作成する関数です。

In [3]:
from datetime import datetime
datetime.fromisoformat('2011-11-04T00:05:23+04:00')
Out[3]:
datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone(datetime.timedelta(seconds=14400)))

datetime.fromisoformat() は便利な関数でありますが、インターネットで用いられる日付形式 ISO 8601/RFC 3339 のうち、一部しかサポートしていませんでした。

WebアプリケーションなどでJavascriptのDateオブジェクトからJSONを作成する場合、日付文字列は '2022-10-19T10:44:22.153Z' という形式になります。しかし、この文字列はPython3.10までの datetime モジュールでは読み込めないため、dateutilパッケージdateutil.parser.isoparse など、外部のパッケージを利用する必要がありました。

Python 3.11ではISO 8601の大部分をサポートするようになり、外部のパッケージを使わなくともJSON中の日付文字列をほぼ問題なく datetime オブジェクトに変換できるようになりました。

In [4]:
datetime.fromisoformat('2022-10-19T10:44:22.153Z')
Out[4]:
datetime.datetime(2022, 10, 19, 10, 44, 22, 153000, tzinfo=datetime.timezone.utc)

PEP 682 - 符号付き0のフォーマット指定子

Pythonのfloatの値を文字列に変換するとき、値が正の値なら簡単です。

In [9]:
value = 0.000001
print(f"値は {value: 0.2f} です")
値は  0.00 です。

しかし、負の値を出力するとき、値が 0 に丸められると

In [10]:
value = -0.000001
print(f"値は {value: 0.2f} です")
値は -0.00 です

と、値は -0.0 となり、負号が出力されてしまいます。Pythonのfloatが準拠するIEEE 754には 負の0 があり、間違いではないのですが、ほとんどの場合このマイナス記号は不必要でしょう。

Python3.11では、floatで使えるフォーマット指定に z が追加され、負の -0.0 は 正の 0.0 に変換できるようになりました。

In [13]:
value = -0.000001
print(f"値は {value: z0.2f} です")
値は  0.00 です
Copyright © 2001-2023 python.jp Privacy Policy python_japan
Amazon.co.jpアソシエイト
Amazonで他のPython書籍を検索